From 75d7492016fa27548a83a3206550d43d8e8ac7d5 Mon Sep 17 00:00:00 2001 From: Kayanski Date: Thu, 16 May 2024 14:41:02 +0000 Subject: [PATCH 01/50] First test modifications --- Cargo.lock | 780 ++++- contracts/dao-dao-core/Cargo.toml | 3 + contracts/dao-dao-core/src/cw_orch_tests.rs | 3068 +++++++++++++++++ contracts/dao-dao-core/src/lib.rs | 2 + contracts/test/dao-proposal-sudo/Cargo.toml | 1 + contracts/test/dao-proposal-sudo/src/msg.rs | 4 +- packages/cw-orch/Cargo.toml | 32 + packages/cw-orch/src/core.rs | 24 + packages/cw-orch/src/lib.rs | 16 + .../src/pre_propose/approval_single.rs | 20 + packages/cw-orch/src/pre_propose/approver.rs | 20 + packages/cw-orch/src/pre_propose/mod.rs | 9 + packages/cw-orch/src/pre_propose/multiple.rs | 20 + packages/cw-orch/src/pre_propose/single.rs | 20 + packages/cw-orch/src/proposal/condorcet.rs | 20 + packages/cw-orch/src/proposal/mod.rs | 7 + packages/cw-orch/src/proposal/multiple.rs | 24 + packages/cw-orch/src/proposal/single.rs | 24 + packages/cw-orch/src/staking/cw20_stake.rs | 20 + .../cw-orch/src/staking/external_rewards.rs | 20 + packages/cw-orch/src/staking/mod.rs | 7 + .../cw-orch/src/staking/reward_distributor.rs | 20 + packages/cw-orch/src/test_contracts/mod.rs | 9 + .../test_contracts/proposal_hook_counter.rs | 20 + .../src/test_contracts/proposal_sudo.rs | 20 + .../src/test_contracts/test_custom_factory.rs | 20 + .../src/test_contracts/voting_cw20_balance.rs | 20 + packages/cw-orch/src/tests.rs | 69 + packages/cw-orch/src/voting/cw20_staked.rs | 24 + packages/cw-orch/src/voting/cw4.rs | 24 + packages/cw-orch/src/voting/cw721_roles.rs | 20 + packages/cw-orch/src/voting/cw721_staked.rs | 24 + packages/cw-orch/src/voting/mod.rs | 11 + packages/cw-orch/src/voting/token_staked.rs | 24 + packages/dao-interface/Cargo.toml | 1 + packages/dao-interface/src/lib.rs | 3 + packages/dao-interface/src/msg.rs | 3 +- 37 files changed, 4341 insertions(+), 112 deletions(-) create mode 100644 contracts/dao-dao-core/src/cw_orch_tests.rs create mode 100644 packages/cw-orch/Cargo.toml create mode 100644 packages/cw-orch/src/core.rs create mode 100644 packages/cw-orch/src/lib.rs create mode 100644 packages/cw-orch/src/pre_propose/approval_single.rs create mode 100644 packages/cw-orch/src/pre_propose/approver.rs create mode 100644 packages/cw-orch/src/pre_propose/mod.rs create mode 100644 packages/cw-orch/src/pre_propose/multiple.rs create mode 100644 packages/cw-orch/src/pre_propose/single.rs create mode 100644 packages/cw-orch/src/proposal/condorcet.rs create mode 100644 packages/cw-orch/src/proposal/mod.rs create mode 100644 packages/cw-orch/src/proposal/multiple.rs create mode 100644 packages/cw-orch/src/proposal/single.rs create mode 100644 packages/cw-orch/src/staking/cw20_stake.rs create mode 100644 packages/cw-orch/src/staking/external_rewards.rs create mode 100644 packages/cw-orch/src/staking/mod.rs create mode 100644 packages/cw-orch/src/staking/reward_distributor.rs create mode 100644 packages/cw-orch/src/test_contracts/mod.rs create mode 100644 packages/cw-orch/src/test_contracts/proposal_hook_counter.rs create mode 100644 packages/cw-orch/src/test_contracts/proposal_sudo.rs create mode 100644 packages/cw-orch/src/test_contracts/test_custom_factory.rs create mode 100644 packages/cw-orch/src/test_contracts/voting_cw20_balance.rs create mode 100644 packages/cw-orch/src/tests.rs create mode 100644 packages/cw-orch/src/voting/cw20_staked.rs create mode 100644 packages/cw-orch/src/voting/cw4.rs create mode 100644 packages/cw-orch/src/voting/cw721_roles.rs create mode 100644 packages/cw-orch/src/voting/cw721_staked.rs create mode 100644 packages/cw-orch/src/voting/mod.rs create mode 100644 packages/cw-orch/src/voting/token_staked.rs diff --git a/Cargo.lock b/Cargo.lock index b1e7d67d1..3215472c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,273 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "abstract-cw-multi-test" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c77f8d4bac08f74fbc4fce8943cb2d35e742682b6cae8cb65555d6cd3830feb" +dependencies = [ + "anyhow", + "bech32 0.11.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20-ics20", + "derivative", + "hex", + "itertools 0.12.1", + "log", + "prost 0.12.3", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "abstract-cw-plus-interface" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7441425a805439500492977107d154af02b1702aa044945775c245d0b3469968" +dependencies = [ + "abstract-cw1", + "abstract-cw1-subkeys", + "abstract-cw1-whitelist", + "abstract-cw20-base", + "abstract-cw20-ics20", + "abstract-cw3-fixed-multisig", + "abstract-cw3-flex-multisig", + "abstract-cw4-group", + "abstract-cw4-stake", + "cosmwasm-std", + "cw-orch", +] + +[[package]] +name = "abstract-cw1" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0895c076ab6a5165133a453f983ec9ccc9b6c41de256b6eb74e523eb555b3ebb" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "abstract-cw1-subkeys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab08cdd6008afa38a52427943bf4aef9541bde78cc9c14849a53ad2608a1161e" +dependencies = [ + "abstract-cw1", + "abstract-cw1-whitelist", + "abstract-cw2", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw1-whitelist" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171a0b5b3694627cf0fa554500d72431169d4013fffd14650d2b7d660230a205" +dependencies = [ + "abstract-cw1", + "abstract-cw2", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw2" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945af4c176b4539be2a74c06aa166287ba964ab58aec98c644addd812431f141" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw20" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d5e4b8084c3a2b3e42502e6c4fe3ed985dc72e86eb612bcc527f4a0443fa42" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-utils 1.0.3", + "schemars", + "serde", +] + +[[package]] +name = "abstract-cw20-base" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d300dec7d602e00841c5ab6fe598d4d290bab32e489c6885c607633c4f3fe67" +dependencies = [ + "abstract-cw2", + "abstract-cw20", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw20-ics20" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027678ddb0e62b4aba5f0167d2b0a3ec0182e1e32c47759be7e30b56775598ee" +dependencies = [ + "abstract-cw2", + "abstract-cw20", + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw3" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c080cc760333d1d3477857aeac19aa7e6e661f1e58d04a7a78212913d49bf517" +dependencies = [ + "abstract-cw20", + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw3-fixed-multisig" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1882e05bef33bd1c6b25e735eda8a23332a78c4df0b24a18ca56a8ca8ed6f222" +dependencies = [ + "abstract-cw2", + "abstract-cw3", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw3-flex-multisig" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92379f3e7c467f081312d6953eb8d300456efa352c9f7c5ef095ad99083d92db" +dependencies = [ + "abstract-cw2", + "abstract-cw20", + "abstract-cw3", + "abstract-cw3-fixed-multisig", + "abstract-cw4", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw4" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aacb0124dce37ee6f2b5636684285bcbaa65a1678980f95ea76366ab74a8912" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "serde", +] + +[[package]] +name = "abstract-cw4-group" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0af5ef484ba1d48fee8485452c81ac3465ba16a5941db90bda4dd6b58b50a9a6" +dependencies = [ + "abstract-cw2", + "abstract-cw4", + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "abstract-cw4-stake" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1eb9985e8b752396a2c5d8fde8ebf65ea81070a95f167a3d31af0746f8e4b4e" +dependencies = [ + "abstract-cw2", + "abstract-cw20", + "abstract-cw4", + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "addr2line" version = "0.22.0" @@ -68,7 +335,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -79,7 +346,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -184,6 +451,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + [[package]] name = "bindgen" version = "0.68.1" @@ -203,7 +476,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.72", + "syn 2.0.74", "which", ] @@ -333,18 +606,21 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.1.6" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +checksum = "5fb8dd288a69fc53a1996d7ecfbf4a20d59065bff137ce7e56bbd620de191189" +dependencies = [ + "shlex", +] [[package]] name = "cexpr" @@ -406,6 +682,15 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -418,9 +703,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cosm-orc" @@ -489,6 +774,17 @@ dependencies = [ "tonic 0.9.2", ] +[[package]] +name = "cosmos-sdk-proto" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.35.0", +] + [[package]] name = "cosmrs" version = "0.9.0" @@ -533,32 +829,31 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd50718a2b6830ce9eb5d465de5a018a12e71729d66b70807ce97e6dd14f931d" +checksum = "0f862b355f7e47711e0acfe6af92cb3fd8fd5936b66a9eaa338b51edabd1e77d" dependencies = [ "digest 0.10.7", - "ecdsa 0.16.9", "ed25519-zebra", - "k256 0.13.1", + "k256 0.13.3", "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "242e98e7a231c122e08f300d9db3262d1007b51758a8732cd6210b3e9faa4f3a" +checksum = "cd85de6467cd1073688c86b39833679ae6db18cf4771471edd9809f15f1679f1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7879036156092ad1c22fe0d7316efc5a5eceec2bc3906462a2560215f2a2f929" +checksum = "5b4cd28147a66eba73720b47636a58097a979ad8c8bfdb4ed437ebcbfe362576" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -569,9 +864,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb57855fbfc83327f8445ae0d413b1a05ac0d68c396ab4d122b2abd7bb82cb6" +checksum = "9acd45c63d41bc9b16bc6dc7f6bd604a8c2ad29ce96c8f3c96d7fc8ef384392e" dependencies = [ "proc-macro2", "quote", @@ -580,12 +875,12 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c1556156fdf892a55cced6115968b961eaaadd6f724a2c2cb7d1e168e32dd3" +checksum = "2685c2182624b2e9e17f7596192de49a3f86b7a0c9a5f6b25c1df5e24592e836" dependencies = [ "base64 0.21.7", - "bech32", + "bech32 0.9.1", "bnum", "cosmwasm-crypto", "cosmwasm-derive", @@ -612,9 +907,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -688,7 +983,7 @@ dependencies = [ name = "cw-admin-factory" version = "2.5.0" dependencies = [ - "bech32", + "bech32 0.9.1", "cosmwasm-schema", "cosmwasm-std", "cw-admin-factory", @@ -891,7 +1186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc392a5cb7e778e3f90adbf7faa43c4db7f35b6623224b08886d796718edb875" dependencies = [ "anyhow", - "bech32", + "bech32 0.9.1", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -904,6 +1199,96 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-orch" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1ddc937c28c59ccf2765fa05ddc0437644d3b283408a7cc64f7b371b0b9309" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-orch-contract-derive", + "cw-orch-core", + "cw-orch-fns-derive", + "cw-orch-mock", + "cw-orch-traits", + "cw-utils 1.0.3", + "hex", + "log", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-orch-contract-derive" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc8ba75692fc7bd30e91c78fad2dc208a738e4e6ea26b232f9352c320e35543" +dependencies = [ + "convert_case", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "cw-orch-core" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abd640f67f655411542a3c148769270c7a9e63d4097c2dc4a1f6edf23b7a9b4" +dependencies = [ + "abstract-cw-multi-test", + "anyhow", + "cosmos-sdk-proto 0.21.1", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "dirs", + "log", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "cw-orch-fns-derive" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9acb7a15bfacc52abdf312a9fffb139883c1effb6ea7e645cd39580a8527463" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-orch-mock" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae9536620b86ee78c2729fd8449538feb4f6257a9809c72c5f9e461e720cf3b" +dependencies = [ + "abstract-cw-multi-test", + "cosmwasm-std", + "cw-orch-core", + "cw-utils 1.0.3", + "log", + "serde", + "sha2 0.10.8", +] + +[[package]] +name = "cw-orch-traits" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5959ce29e9d8a52594b47933a0a2736ea94dd9bf5e29b220cbdbe2b097f07c3a" +dependencies = [ + "cw-orch-core", + "prost 0.12.3", + "prost-types 0.12.3", +] + [[package]] name = "cw-ownable" version = "0.5.1" @@ -1339,6 +1724,25 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20-ics20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76221201da08fed611c857ea3aa21c031a4a7dc771a8b1750559ca987335dc02" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "cw20-stake" version = "0.2.6" @@ -1641,6 +2045,34 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-cw-orch" +version = "2.5.0" +dependencies = [ + "cw-orch", + "cw20-stake 2.5.0", + "cw20-stake-external-rewards", + "cw20-stake-reward-distributor", + "dao-dao-core 2.5.0", + "dao-interface 2.5.0", + "dao-pre-propose-approval-single 2.5.0", + "dao-pre-propose-approver", + "dao-pre-propose-multiple 2.5.0", + "dao-pre-propose-single 2.5.0", + "dao-proposal-condorcet", + "dao-proposal-hook-counter", + "dao-proposal-multiple 2.5.0", + "dao-proposal-single 2.5.0", + "dao-proposal-sudo", + "dao-test-custom-factory", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", + "dao-voting-cw4 2.5.0", + "dao-voting-cw721-roles", + "dao-voting-cw721-staked", + "dao-voting-token-staked", +] + [[package]] name = "dao-cw721-extensions" version = "2.5.0" @@ -1675,10 +2107,12 @@ dependencies = [ name = "dao-dao-core" version = "2.5.0" dependencies = [ + "abstract-cw-plus-interface", "cosmwasm-schema", "cosmwasm-std", "cw-core", "cw-multi-test", + "cw-orch", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1687,6 +2121,7 @@ dependencies = [ "cw20-base 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", + "dao-cw-orch", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", "dao-proposal-sudo", @@ -1767,6 +2202,7 @@ version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", + "cw-orch", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", @@ -2188,6 +2624,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw2 1.1.2", "dao-dao-macros 2.5.0", @@ -2572,6 +3009,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dlv-list" version = "0.3.0" @@ -2846,7 +3304,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2949,7 +3407,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.6", + "indexmap 2.4.0", "slab", "tokio", "tokio-util", @@ -3001,6 +3459,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -3179,9 +3643,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -3223,11 +3687,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -3241,6 +3705,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -3258,9 +3731,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -3291,9 +3764,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa 0.16.9", @@ -3340,6 +3813,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -3393,13 +3876,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3424,22 +3908,23 @@ dependencies = [ ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "autocfg", + "proc-macro2", + "quote", + "syn 2.0.74", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "hermit-abi", - "libc", + "autocfg", ] [[package]] @@ -3453,9 +3938,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -3507,6 +3992,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-multimap" version = "0.4.3" @@ -3655,7 +4146,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3686,7 +4177,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3723,9 +4214,12 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" @@ -3734,7 +4228,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3798,10 +4292,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3867,11 +4361,22 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -4074,7 +4579,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4146,9 +4651,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" dependencies = [ "serde_derive", ] @@ -4182,13 +4687,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4199,16 +4704,17 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -4221,7 +4727,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4230,7 +4736,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.4.0", "itoa", "ryu", "serde", @@ -4445,9 +4951,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" dependencies = [ "proc-macro2", "quote", @@ -4558,7 +5064,7 @@ checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", "prost 0.11.9", "prost-types 0.11.9", @@ -4576,7 +5082,7 @@ checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", "prost 0.11.9", "prost-types 0.11.9", @@ -4594,7 +5100,7 @@ checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.3.3", "num-traits", "prost 0.11.9", "prost-types 0.11.9", @@ -4604,6 +5110,24 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-proto" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.4.2", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-rpc" version = "0.23.9" @@ -4698,7 +5222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d506c7664333e246f564949bee4ed39062aa0f11918e6f5a95f553cdad65c274" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4734,7 +5258,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4771,19 +5295,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.1" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4798,13 +5321,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -4933,15 +5456,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4962,7 +5485,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5023,6 +5546,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -5054,9 +5583,9 @@ checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vote-hooks" @@ -5097,34 +5626,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5132,28 +5662,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -5208,11 +5738,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5239,6 +5769,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5381,6 +5920,27 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -5398,5 +5958,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] diff --git a/contracts/dao-dao-core/Cargo.toml b/contracts/dao-dao-core/Cargo.toml index a9ac8dae6..549f93f98 100644 --- a/contracts/dao-dao-core/Cargo.toml +++ b/contracts/dao-dao-core/Cargo.toml @@ -31,8 +31,11 @@ cw-paginate-storage = { workspace = true } cw-core-v1 = { workspace = true, features = ["library"] } [dev-dependencies] +abstract-cw-plus-interface = "2.0.1" cw-multi-test = { workspace = true } +cw-orch = "0.22.2" cw20-base = { workspace = true } cw721-base = { workspace = true } +dao-cw-orch = { path = "../../packages/cw-orch" } dao-proposal-sudo = { workspace = true } dao-voting-cw20-balance = { workspace = true } diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs new file mode 100644 index 000000000..ebfd8eb58 --- /dev/null +++ b/contracts/dao-dao-core/src/cw_orch_tests.rs @@ -0,0 +1,3068 @@ +use crate::{ + contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, + state::PROPOSAL_MODULES, + ContractError, +}; +use abstract_cw_plus_interface::cw20_base::Cw20Base; +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{ + from_json, + testing::{mock_dependencies, mock_env}, + to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, +}; +use cw2::{set_contract_version, ContractVersion}; +use cw_multi_test::{App, Contract, ContractWrapper, Executor}; +use cw_orch::prelude::*; +use cw_storage_plus::{Item, Map}; +use cw_utils::{Duration, Expiration}; +use dao_cw_orch::{DaoDaoCore, DaoProposalSudo}; +use dao_interface::CoreQueryMsgFns; +use dao_interface::{ + msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg, QueryMsg}, + query::{ + AdminNominationResponse, Cw20BalanceResponse, DumpStateResponse, GetItemResponse, + PauseInfoResponse, ProposalModuleCountResponse, SubDao, + }, + state::{Admin, Config, ModuleInstantiateInfo, ProposalModule, ProposalModuleStatus}, + voting::{InfoResponse, VotingPowerAtHeightResponse}, +}; +use dao_proposal_sudo::msg::ExecuteMsgFns as _; + +const CREATOR_ADDR: &str = "creator"; + +fn cw20_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_base::contract::execute, + cw20_base::contract::instantiate, + cw20_base::contract::query, + ); + Box::new(contract) +} + +fn cw721_contract() -> Box> { + let contract = ContractWrapper::new( + cw721_base::entry::execute, + cw721_base::entry::instantiate, + cw721_base::entry::query, + ); + Box::new(contract) +} + +fn sudo_proposal_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_sudo::contract::execute, + dao_proposal_sudo::contract::instantiate, + dao_proposal_sudo::contract::query, + ); + Box::new(contract) +} + +fn cw20_balances_voting() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw20_balance::contract::execute, + dao_voting_cw20_balance::contract::instantiate, + dao_voting_cw20_balance::contract::query, + ) + .with_reply(dao_voting_cw20_balance::contract::reply); + Box::new(contract) +} + +fn cw_core_contract() -> Box> { + let contract = ContractWrapper::new( + crate::contract::execute, + crate::contract::instantiate, + crate::contract::query, + ) + .with_reply(crate::contract::reply) + .with_migrate(crate::contract::migrate); + Box::new(contract) +} + +fn v1_cw_core_contract() -> Box> { + use cw_core_v1::contract; + let contract = ContractWrapper::new(contract::execute, contract::instantiate, contract::query) + .with_reply(contract::reply) + .with_migrate(contract::migrate); + Box::new(contract) +} + +fn test_instantiate_with_n_gov_modules(n: usize) { + let mock = MockBech32::new("mock"); + let cw20 = Cw20Base::new("cw20", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + cw20.upload().unwrap(); + let cw20_id = cw20.code_id().unwrap(); + gov.upload().unwrap(); + + let cw20_instantiate = cw20_base::msg::InstantiateMsg { + name: "DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![], + mint: None, + marketing: None, + }; + let instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary(&cw20_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: (0..n) + .map(|n| ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary(&cw20_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: format!("governance module {n}"), + }) + .collect(), + initial_items: None, + }; + gov.instantiate(&instantiate, None, None).unwrap(); + + let state = gov.dump_state().unwrap(); + + assert_eq!( + state.config, + Config { + dao_uri: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + } + ); + + assert_eq!(state.proposal_modules.len(), n); + + assert_eq!(state.active_proposal_module_count, n as u32); + assert_eq!(state.total_proposal_module_count, n as u32); +} + +#[test] +#[should_panic(expected = "Execution would result in no proposal modules being active.")] +fn test_instantiate_with_zero_gov_modules() { + test_instantiate_with_n_gov_modules(0) +} + +#[test] +fn test_valid_instantiate() { + let module_counts = [1, 2, 200]; + for count in module_counts { + test_instantiate_with_n_gov_modules(count) + } +} + +#[test] +#[should_panic( + expected = "Error parsing into type abstract_cw20_base::msg::InstantiateMsg: Invalid type" +)] +fn test_instantiate_with_submessage_failure() { + let mock = MockBech32::new("mock"); + let cw20 = Cw20Base::new("cw20", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + cw20.upload().unwrap(); + let cw20_id = cw20.code_id().unwrap(); + gov.upload().unwrap(); + + let cw20_instantiate = cw20_base::msg::InstantiateMsg { + name: "DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![], + mint: None, + marketing: None, + }; + + let mut governance_modules = (0..3) + .map(|n| ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary(&cw20_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: format!("governance module {n}"), + }) + .collect::>(); + governance_modules.push(ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary("bad").unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "I have a bad instantiate message".to_string(), + }); + governance_modules.push(ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary(&cw20_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "Everybody knowing +that goodness is good +makes wickedness." + .to_string(), + }); + + let instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: cw20_id, + msg: to_json_binary(&cw20_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: governance_modules, + initial_items: None, + }; + + gov.instantiate(&instantiate, None, None).unwrap(); +} + +#[test] +fn test_update_config() -> cw_orch::anyhow::Result<()> { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload()?; + let govmod_id = gov_mod.code_id()?; + gov.upload()?; + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate)?, + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate)?, + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }], + initial_items: None, + }; + + gov.instantiate(&gov_instantiate, None, None)?; + + let modules = gov.proposal_modules(None, None)?; + assert_eq!(modules.len(), 1); + gov_mod.set_address(&modules[0].clone().address); + + let expected_config = Config { + name: "Root DAO".to_string(), + description: "We love trees and sudo.".to_string(), + image_url: Some("https://moonphase.is/image.svg".to_string()), + automatically_add_cw20s: false, + automatically_add_cw721s: true, + dao_uri: Some("https://daostar.one/EIP".to_string()), + }; + + gov_mod.proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address()?.to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateConfig { + config: expected_config.clone(), + })?, + } + .into()])?; + + assert_eq!(expected_config, gov.config()?); + + assert_eq!(gov.dao_uri()?.dao_uri, expected_config.dao_uri); + Ok(()) +} + +fn test_swap_governance(swaps: Vec<(u32, u32)>) { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let propmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: propmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: propmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + gov.instantiate(&gov_instantiate, None, None).unwrap(); + + let modules = gov.proposal_modules(None, None).unwrap(); + assert_eq!(modules.len(), 1); + let module_count = gov.proposal_module_count().unwrap(); + + assert_eq!( + module_count, + ProposalModuleCountResponse { + active_proposal_module_count: 1, + total_proposal_module_count: 1, + } + ); + + let (to_add, to_remove) = swaps + .iter() + .cloned() + .reduce(|(to_add, to_remove), (add, remove)| (to_add + add, to_remove + remove)) + .unwrap_or((0, 0)); + + for (add, remove) in swaps { + let start_modules = gov.proposal_modules(None, None).unwrap(); + + let start_modules_active: Vec = get_active_modules(&gov); + gov_mod.set_address(&start_modules_active[0].address.clone()); + let to_add: Vec<_> = (0..add) + .map(|n| ModuleInstantiateInfo { + code_id: propmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: format!("governance module {n}"), + }) + .collect(); + + let to_disable: Vec<_> = start_modules_active + .iter() + .rev() + .take(remove as usize) + .map(|a| a.address.to_string()) + .collect(); + + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) + .unwrap(), + } + .into()]) + .unwrap(); + + let finish_modules_active = get_active_modules(&gov); + + assert_eq!( + finish_modules_active.len() as u32, + start_modules_active.len() as u32 + add - remove + ); + for module in start_modules + .clone() + .into_iter() + .rev() + .take(remove as usize) + { + assert!(!finish_modules_active.contains(&module)) + } + + let state: DumpStateResponse = gov.dump_state().unwrap(); + assert_eq!( + state.active_proposal_module_count, + finish_modules_active.len() as u32 + ); + + assert_eq!( + state.total_proposal_module_count, + start_modules.len() as u32 + add + ) + } + + let module_count = gov.proposal_module_count().unwrap(); + assert_eq!( + module_count, + ProposalModuleCountResponse { + active_proposal_module_count: 1 + to_add - to_remove, + total_proposal_module_count: 1 + to_add, + } + ); +} + +#[test] +fn test_update_governance() { + test_swap_governance(vec![(1, 1), (5, 0), (0, 5), (0, 0)]); + test_swap_governance(vec![(1, 1), (1, 1), (1, 1), (1, 1)]) +} + +#[test] +fn test_add_then_remove_governance() { + test_swap_governance(vec![(1, 0), (0, 1)]) +} + +#[test] +#[should_panic(expected = "Execution would result in no proposal modules being active.")] +fn test_swap_governance_bad() { + test_swap_governance(vec![(1, 1), (0, 1)]) +} + +#[test] +fn test_removed_modules_can_not_execute() { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + gov.instantiate(&gov_instantiate, None, None).unwrap(); + + let modules = gov.proposal_modules(None, None).unwrap(); + + assert_eq!(modules.len(), 1); + + let start_module = modules.into_iter().next().unwrap(); + gov_mod.set_address(&start_module.address); + + let to_add = vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "new governance module".to_string(), + }]; + + let to_disable = vec![start_module.address.to_string()]; + + // Swap ourselves out. + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), + } + .into()]) + .unwrap(); + + let finish_modules_active = get_active_modules(&gov); + + let new_proposal_module = finish_modules_active.into_iter().next().unwrap(); + + // Try to add a new module and remove the one we added + // earlier. This should fail as we have been removed. + let to_add = vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "new governance module".to_string(), + }]; + let to_disable = vec![new_proposal_module.address.to_string()]; + + let err = gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { + to_add: to_add.clone(), + to_disable: to_disable.clone(), + }) + .unwrap(), + } + .into()]) + .unwrap_err(); + + println!("{}", err); + assert!(format!("{:?}", err) + .contains("Proposal module with address is disabled and cannot execute messages")); + + // Check that the enabled query works. + let enabled_modules = gov.active_proposal_modules(None, None).unwrap(); + + assert_eq!(enabled_modules, vec![new_proposal_module.clone()]); + + // The new proposal module should be able to perform actions. + gov_mod.set_address(&new_proposal_module.address); + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), + } + .into()]) + .unwrap(); +} + +#[test] +fn test_module_already_disabled() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let gov_id = app.store_code(cw_core_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + let modules: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(modules.len(), 1); + + let start_module = modules.into_iter().next().unwrap(); + + let to_disable = vec![ + start_module.address.to_string(), + start_module.address.to_string(), + ]; + + let err: ContractError = app + .execute_contract( + Addr::unchecked(CREATOR_ADDR), + start_module.address.clone(), + &dao_proposal_sudo::msg::ExecuteMsg::Execute { + msgs: vec![WasmMsg::Execute { + contract_addr: gov_addr.to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { + to_add: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + to_disable, + }) + .unwrap(), + } + .into()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + + assert_eq!( + err, + ContractError::ModuleAlreadyDisabled { + address: start_module.address + } + ) +} + +#[test] +fn test_swap_voting_module() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let gov_id = app.store_code(cw_core_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + let voting_addr: Addr = app + .wrap() + .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) + .unwrap(); + + let modules: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(modules.len(), 1); + + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + modules[0].address.clone(), + &dao_proposal_sudo::msg::ExecuteMsg::Execute { + msgs: vec![WasmMsg::Execute { + contract_addr: gov_addr.to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { + module: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + }) + .unwrap(), + } + .into()], + }, + &[], + ) + .unwrap(); + + let new_voting_addr: Addr = app + .wrap() + .query_wasm_smart(gov_addr, &QueryMsg::VotingModule {}) + .unwrap(); + + assert_ne!(new_voting_addr, voting_addr); +} + +fn test_unauthorized(app: &mut App, gov_addr: Addr, msg: ExecuteMsg) { + let err: ContractError = app + .execute_contract(Addr::unchecked(CREATOR_ADDR), gov_addr, &msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + + assert_eq!(err, ContractError::Unauthorized {}); +} + +#[test] +fn test_permissions() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let gov_id = app.store_code(cw_core_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + test_unauthorized( + &mut app, + gov_addr.clone(), + ExecuteMsg::UpdateVotingModule { + module: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + }, + ); + + test_unauthorized( + &mut app, + gov_addr.clone(), + ExecuteMsg::UpdateProposalModules { + to_add: vec![], + to_disable: vec![], + }, + ); + + test_unauthorized( + &mut app, + gov_addr, + ExecuteMsg::UpdateConfig { + config: Config { + dao_uri: None, + name: "Evil config.".to_string(), + description: "👿".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }, + }, + ); +} + +fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let voting_id = app.store_code(cw20_balances_voting()); + let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20_id, + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: CREATOR_ADDR.to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: auto_add, + automatically_add_cw721s: auto_add, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: voting_id, + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + (gov_addr, app) +} + +#[test] +fn test_admin_permissions() { + let (core_addr, mut app) = do_standard_instantiate(true, None); + + let start_height = app.block_info().height; + let proposal_modules: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + // Random address can't call ExecuteAdminMsgs + let res = app.execute_contract( + Addr::unchecked("random"), + core_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + res.unwrap_err(); + + // Proposal module can't call ExecuteAdminMsgs + let res = app.execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + res.unwrap_err(); + + // Update Admin can't be called by non-admins + let res = app.execute_contract( + Addr::unchecked("rando"), + core_addr.clone(), + &ExecuteMsg::NominateAdmin { + admin: Some("rando".to_string()), + }, + &[], + ); + res.unwrap_err(); + + // Nominate admin can be called by core contract as no admin was + // specified so the admin defaulted to the core contract. + let res = app.execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::NominateAdmin { + admin: Some("meow".to_string()), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + res.unwrap(); + + // Instantiate new DAO with an admin + let (core_with_admin_addr, mut app) = + do_standard_instantiate(true, Some(Addr::unchecked("admin").to_string())); + + // Non admins still can't call ExecuteAdminMsgs + let res = app.execute_contract( + proposal_module.address, + core_with_admin_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_with_admin_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + res.unwrap_err(); + + // Admin cannot directly pause the DAO + let res = app.execute_contract( + Addr::unchecked("admin"), + core_with_admin_addr.clone(), + &ExecuteMsg::Pause { + duration: Duration::Height(10), + }, + &[], + ); + assert!(res.is_err()); + + // Random person cannot pause the DAO + let res = app.execute_contract( + Addr::unchecked("random"), + core_with_admin_addr.clone(), + &ExecuteMsg::Pause { + duration: Duration::Height(10), + }, + &[], + ); + assert!(res.is_err()); + + // Admin can call ExecuteAdminMsgs, here an admin pauses the DAO + let res = app.execute_contract( + Addr::unchecked("admin"), + core_with_admin_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_with_admin_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + assert!(res.is_ok()); + + // Ensure we are paused for 10 blocks + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!( + paused, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + + // DAO unpauses after 10 blocks + app.update_block(|block| block.height += 11); + + // Check we are unpaused + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!(paused, PauseInfoResponse::Unpaused {}); + + // Admin pauses DAO again + let res = app.execute_contract( + Addr::unchecked("admin"), + core_with_admin_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_with_admin_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + assert!(res.is_ok()); + + // DAO with admin cannot unpause itself + let res = app.execute_contract( + core_with_admin_addr.clone(), + core_with_admin_addr.clone(), + &ExecuteMsg::Unpause {}, + &[], + ); + assert!(res.is_err()); + + // Random person cannot unpause the DAO + let res = app.execute_contract( + Addr::unchecked("random"), + core_with_admin_addr.clone(), + &ExecuteMsg::Unpause {}, + &[], + ); + assert!(res.is_err()); + + // Admin can unpause the DAO directly + let res = app.execute_contract( + Addr::unchecked("admin"), + core_with_admin_addr.clone(), + &ExecuteMsg::Unpause {}, + &[], + ); + assert!(res.is_ok()); + + // Check we are unpaused + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!(paused, PauseInfoResponse::Unpaused {}); + + // Admin can nominate a new admin. + let res = app.execute_contract( + Addr::unchecked("admin"), + core_with_admin_addr.clone(), + &ExecuteMsg::NominateAdmin { + admin: Some("meow".to_string()), + }, + &[], + ); + res.unwrap(); + + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!( + nomination, + AdminNominationResponse { + nomination: Some(Addr::unchecked("meow")) + } + ); + + // Check that admin has not yet been updated + let res: Addr = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(res, Addr::unchecked("admin")); + + // Only the nominated address may accept the nomination. + let err: ContractError = app + .execute_contract( + Addr::unchecked("random"), + core_with_admin_addr.clone(), + &ExecuteMsg::AcceptAdminNomination {}, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + // Accept the nomination. + app.execute_contract( + Addr::unchecked("meow"), + core_with_admin_addr.clone(), + &ExecuteMsg::AcceptAdminNomination {}, + &[], + ) + .unwrap(); + + // Check that admin has been updated + let res: Addr = app + .wrap() + .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(res, Addr::unchecked("meow")); + + // Check that the pending admin has been cleared. + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_with_admin_addr, &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!(nomination, AdminNominationResponse { nomination: None }); +} + +#[test] +fn test_admin_nomination() { + let (core_addr, mut app) = do_standard_instantiate(true, Some("admin".to_string())); + + // Check that there is no pending nominations. + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!(nomination, AdminNominationResponse { nomination: None }); + + // Nominate a new admin. + app.execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::NominateAdmin { + admin: Some("ekez".to_string()), + }, + &[], + ) + .unwrap(); + + // Check that the nomination is in place. + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!( + nomination, + AdminNominationResponse { + nomination: Some(Addr::unchecked("ekez")) + } + ); + + // Non-admin can not withdraw. + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + core_addr.clone(), + &ExecuteMsg::WithdrawAdminNomination {}, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + // Admin can withdraw. + app.execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::WithdrawAdminNomination {}, + &[], + ) + .unwrap(); + + // Check that the nomination is withdrawn. + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!(nomination, AdminNominationResponse { nomination: None }); + + // Can not withdraw if no nomination is pending. + let err: ContractError = app + .execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::WithdrawAdminNomination {}, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::NoAdminNomination {}); + + // Can not claim nomination b/c it has been withdrawn. + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + core_addr.clone(), + &ExecuteMsg::AcceptAdminNomination {}, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::NoAdminNomination {}); + + // Nominate a new admin. + app.execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::NominateAdmin { + admin: Some("meow".to_string()), + }, + &[], + ) + .unwrap(); + + // A new nomination can not be created if there is already a + // pending nomination. + let err: ContractError = app + .execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::NominateAdmin { + admin: Some("arthur".to_string()), + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::PendingNomination {}); + + // Only nominated admin may accept. + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + core_addr.clone(), + &ExecuteMsg::AcceptAdminNomination {}, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + app.execute_contract( + Addr::unchecked("meow"), + core_addr.clone(), + &ExecuteMsg::AcceptAdminNomination {}, + &[], + ) + .unwrap(); + + // Check that meow is the new admin. + let admin: Addr = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(admin, Addr::unchecked("meow".to_string())); + + let start_height = app.block_info().height; + // Check that the new admin can do admin things and the old can not. + let err: ContractError = app + .execute_contract( + Addr::unchecked("admin"), + core_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + let res = app.execute_contract( + Addr::unchecked("meow"), + core_addr.clone(), + &ExecuteMsg::ExecuteAdminMsgs { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ); + res.unwrap(); + + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!( + paused, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + + // DAO unpauses after 10 blocks + app.update_block(|block| block.height += 11); + + // Remove the admin. + app.execute_contract( + Addr::unchecked("meow"), + core_addr.clone(), + &ExecuteMsg::NominateAdmin { admin: None }, + &[], + ) + .unwrap(); + + // Check that this has not caused an admin to be nominated. + let nomination: AdminNominationResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) + .unwrap(); + assert_eq!(nomination, AdminNominationResponse { nomination: None }); + + // Check that admin has been updated. As there was no admin + // nominated the admin should revert back to the contract address. + let res: Addr = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) + .unwrap(); + assert_eq!(res, core_addr); +} + +#[test] +fn test_passthrough_voting_queries() { + let (gov_addr, app) = do_standard_instantiate(true, None); + + let creator_voting_power: VotingPowerAtHeightResponse = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::VotingPowerAtHeight { + address: CREATOR_ADDR.to_string(), + height: None, + }, + ) + .unwrap(); + + assert_eq!( + creator_voting_power, + VotingPowerAtHeightResponse { + power: Uint128::from(2u64), + height: app.block_info().height, + } + ); +} + +fn set_item(app: &mut App, gov_addr: Addr, key: String, value: String) { + app.execute_contract( + gov_addr.clone(), + gov_addr, + &ExecuteMsg::SetItem { key, value }, + &[], + ) + .unwrap(); +} + +fn remove_item(app: &mut App, gov_addr: Addr, key: String) { + app.execute_contract( + gov_addr.clone(), + gov_addr, + &ExecuteMsg::RemoveItem { key }, + &[], + ) + .unwrap(); +} + +fn get_item(app: &mut App, gov_addr: Addr, key: String) -> GetItemResponse { + app.wrap() + .query_wasm_smart(gov_addr, &QueryMsg::GetItem { key }) + .unwrap() +} + +fn list_items( + app: &mut App, + gov_addr: Addr, + start_at: Option, + limit: Option, +) -> Vec<(String, String)> { + app.wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::ListItems { + start_after: start_at, + limit, + }, + ) + .unwrap() +} + +#[test] +fn test_item_permissions() { + let (gov_addr, mut app) = do_standard_instantiate(true, None); + + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + gov_addr.clone(), + &ExecuteMsg::SetItem { + key: "k".to_string(), + value: "v".to_string(), + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); + + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + gov_addr, + &ExecuteMsg::RemoveItem { + key: "k".to_string(), + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Unauthorized {}); +} + +#[test] +fn test_add_remove_get() { + let (gov_addr, mut app) = do_standard_instantiate(true, None); + + let a = get_item(&mut app, gov_addr.clone(), "aaaaa".to_string()); + assert_eq!(a, GetItemResponse { item: None }); + + set_item( + &mut app, + gov_addr.clone(), + "aaaaakey".to_string(), + "aaaaaaddr".to_string(), + ); + let a = get_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); + assert_eq!( + a, + GetItemResponse { + item: Some("aaaaaaddr".to_string()) + } + ); + + remove_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); + let a = get_item(&mut app, gov_addr, "aaaaakey".to_string()); + assert_eq!(a, GetItemResponse { item: None }); +} + +#[test] +#[should_panic(expected = "Key is missing from storage")] +fn test_remove_missing_key() { + let (gov_addr, mut app) = do_standard_instantiate(true, None); + remove_item(&mut app, gov_addr, "b".to_string()) +} + +#[test] +fn test_list_items() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let voting_id = app.store_code(cw20_balances_voting()); + let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20_id, + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: CREATOR_ADDR.to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: voting_id, + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + set_item( + &mut app, + gov_addr.clone(), + "fookey".to_string(), + "fooaddr".to_string(), + ); + set_item( + &mut app, + gov_addr.clone(), + "barkey".to_string(), + "baraddr".to_string(), + ); + set_item( + &mut app, + gov_addr.clone(), + "loremkey".to_string(), + "loremaddr".to_string(), + ); + set_item( + &mut app, + gov_addr.clone(), + "ipsumkey".to_string(), + "ipsumaddr".to_string(), + ); + + // Foo returned as we are only getting one item and items are in + // decending order. + let first_item = list_items(&mut app, gov_addr.clone(), None, Some(1)); + assert_eq!(first_item.len(), 1); + assert_eq!( + first_item[0], + ("loremkey".to_string(), "loremaddr".to_string()) + ); + + let no_items = list_items(&mut app, gov_addr.clone(), None, Some(0)); + assert_eq!(no_items.len(), 0); + + // Items are retreived in decending order so asking for foo with + // no limit ought to give us the barkey k/v. this will be the last item + // note: the paginate map bound is exclusive, so fookey will be starting point + let last_item = list_items(&mut app, gov_addr.clone(), Some("foo".to_string()), None); + assert_eq!(last_item.len(), 1); + assert_eq!(last_item[0], ("barkey".to_string(), "baraddr".to_string())); + + // Items are retreived in decending order so asking for ipsum with + // 4 limit ought to give us the fookey and barkey k/vs. + let after_foo_list = list_items(&mut app, gov_addr, Some("ipsum".to_string()), Some(4)); + assert_eq!(after_foo_list.len(), 2); + assert_eq!( + after_foo_list, + vec![ + ("fookey".to_string(), "fooaddr".to_string()), + ("barkey".to_string(), "baraddr".to_string()) + ] + ); +} + +#[test] +fn test_instantiate_with_items() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let voting_id = app.store_code(cw20_balances_voting()); + let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20_id, + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: CREATOR_ADDR.to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + let mut initial_items = vec![ + InitialItem { + key: "item0".to_string(), + value: "item0_value".to_string(), + }, + InitialItem { + key: "item1".to_string(), + value: "item1_value".to_string(), + }, + InitialItem { + key: "item0".to_string(), + value: "item0_value_override".to_string(), + }, + ]; + + let mut gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: voting_id, + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: Some(initial_items.clone()), + }; + + // Ensure duplicates are dissallowed. + let err: ContractError = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!( + err, + ContractError::DuplicateInitialItem { + item: "item0".to_string() + } + ); + + initial_items.pop(); + gov_instantiate.initial_items = Some(initial_items); + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + // Ensure initial items were added. + let items = list_items(&mut app, gov_addr.clone(), None, None); + assert_eq!(items.len(), 2); + + // Descending order, so item1 is first. + assert_eq!(items[1].0, "item0".to_string()); + let get_item0 = get_item(&mut app, gov_addr.clone(), "item0".to_string()); + assert_eq!( + get_item0, + GetItemResponse { + item: Some("item0_value".to_string()), + } + ); + + assert_eq!(items[0].0, "item1".to_string()); + let item1_value = get_item(&mut app, gov_addr, "item1".to_string()).item; + assert_eq!(item1_value, Some("item1_value".to_string())) +} + +#[test] +fn test_cw20_receive_auto_add() { + let (gov_addr, mut app) = do_standard_instantiate(true, None); + + let cw20_id = app.store_code(cw20_contract()); + let another_cw20 = app + .instantiate_contract( + cw20_id, + Addr::unchecked(CREATOR_ADDR), + &cw20_base::msg::InstantiateMsg { + name: "DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![], + mint: None, + marketing: None, + }, + &[], + "another-token", + None, + ) + .unwrap(); + + let voting_module: Addr = app + .wrap() + .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) + .unwrap(); + let gov_token: Addr = app + .wrap() + .query_wasm_smart( + voting_module, + &dao_interface::voting::Query::TokenContract {}, + ) + .unwrap(); + + // Check that the balances query works with no tokens. + let cw20_balances: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw20Balances { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_balances, vec![]); + + // Send a gov token to the governance contract. + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + gov_token.clone(), + &cw20::Cw20ExecuteMsg::Send { + contract: gov_addr.to_string(), + amount: Uint128::new(1), + msg: to_json_binary(&"").unwrap(), + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw20TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, vec![gov_token.clone()]); + + let cw20_balances: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw20Balances { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!( + cw20_balances, + vec![Cw20BalanceResponse { + addr: gov_token.clone(), + balance: Uint128::new(1), + }] + ); + + // Test removing and adding some new ones. Invalid should fail. + let err: ContractError = app + .execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw20List { + to_add: vec!["new".to_string()], + to_remove: vec![gov_token.to_string()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert!(matches!(err, ContractError::Std(_))); + + // Test that non-DAO can not update the list. + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + gov_addr.clone(), + &ExecuteMsg::UpdateCw20List { + to_add: vec![], + to_remove: vec![gov_token.to_string()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert!(matches!(err, ContractError::Unauthorized {})); + + app.execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw20List { + to_add: vec![another_cw20.to_string()], + to_remove: vec![gov_token.to_string()], + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::Cw20TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, vec![another_cw20]); +} + +#[test] +fn test_cw20_receive_no_auto_add() { + let (gov_addr, mut app) = do_standard_instantiate(false, None); + + let cw20_id = app.store_code(cw20_contract()); + let another_cw20 = app + .instantiate_contract( + cw20_id, + Addr::unchecked(CREATOR_ADDR), + &cw20_base::msg::InstantiateMsg { + name: "DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![], + mint: None, + marketing: None, + }, + &[], + "another-token", + None, + ) + .unwrap(); + + let voting_module: Addr = app + .wrap() + .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) + .unwrap(); + let gov_token: Addr = app + .wrap() + .query_wasm_smart( + voting_module, + &dao_interface::voting::Query::TokenContract {}, + ) + .unwrap(); + + // Send a gov token to the governance contract. Should not be + // added becasue auto add is turned off. + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + gov_token.clone(), + &cw20::Cw20ExecuteMsg::Send { + contract: gov_addr.to_string(), + amount: Uint128::new(1), + msg: to_json_binary(&"").unwrap(), + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw20TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, Vec::::new()); + + app.execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw20List { + to_add: vec![another_cw20.to_string(), gov_token.to_string()], + to_remove: vec!["ok to remove non existent".to_string()], + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::Cw20TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, vec![another_cw20, gov_token]); +} + +#[test] +fn test_cw721_receive() { + let (gov_addr, mut app) = do_standard_instantiate(true, None); + + let cw721_id = app.store_code(cw721_contract()); + + let cw721_addr = app + .instantiate_contract( + cw721_id, + Addr::unchecked(CREATOR_ADDR), + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: CREATOR_ADDR.to_string(), + }, + &[], + "cw721", + None, + ) + .unwrap(); + + let another_cw721 = app + .instantiate_contract( + cw721_id, + Addr::unchecked(CREATOR_ADDR), + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: CREATOR_ADDR.to_string(), + }, + &[], + "cw721", + None, + ) + .unwrap(); + + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + cw721_addr.clone(), + &cw721_base::msg::ExecuteMsg::, Empty>::Mint { + token_id: "ekez".to_string(), + owner: CREATOR_ADDR.to_string(), + token_uri: None, + extension: None, + }, + &[], + ) + .unwrap(); + + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + cw721_addr.clone(), + &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { + contract: gov_addr.to_string(), + token_id: "ekez".to_string(), + msg: to_json_binary("").unwrap(), + }, + &[], + ) + .unwrap(); + + let cw721_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw721TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw721_list, vec![cw721_addr.clone()]); + + // Try to add an invalid cw721. + let err: ContractError = app + .execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw721List { + to_add: vec!["new".to_string(), cw721_addr.to_string()], + to_remove: vec![cw721_addr.to_string()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert!(matches!(err, ContractError::Std(_))); + + // Test that non-DAO can not update the list. + let err: ContractError = app + .execute_contract( + Addr::unchecked("ekez"), + gov_addr.clone(), + &ExecuteMsg::UpdateCw721List { + to_add: vec![], + to_remove: vec![cw721_addr.to_string()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + assert!(matches!(err, ContractError::Unauthorized {})); + + // Add a real cw721. + app.execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw721List { + to_add: vec![another_cw721.to_string(), cw721_addr.to_string()], + to_remove: vec![cw721_addr.to_string()], + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::Cw721TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, vec![another_cw721]); +} + +#[test] +fn test_cw721_receive_no_auto_add() { + let (gov_addr, mut app) = do_standard_instantiate(false, None); + + let cw721_id = app.store_code(cw721_contract()); + + let cw721_addr = app + .instantiate_contract( + cw721_id, + Addr::unchecked(CREATOR_ADDR), + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: CREATOR_ADDR.to_string(), + }, + &[], + "cw721", + None, + ) + .unwrap(); + + let another_cw721 = app + .instantiate_contract( + cw721_id, + Addr::unchecked(CREATOR_ADDR), + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: CREATOR_ADDR.to_string(), + }, + &[], + "cw721", + None, + ) + .unwrap(); + + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + cw721_addr.clone(), + &cw721_base::msg::ExecuteMsg::, Empty>::Mint { + token_id: "ekez".to_string(), + owner: CREATOR_ADDR.to_string(), + token_uri: None, + extension: None, + }, + &[], + ) + .unwrap(); + + app.execute_contract( + Addr::unchecked(CREATOR_ADDR), + cw721_addr.clone(), + &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { + contract: gov_addr.to_string(), + token_id: "ekez".to_string(), + msg: to_json_binary("").unwrap(), + }, + &[], + ) + .unwrap(); + + let cw721_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr.clone(), + &QueryMsg::Cw721TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw721_list, Vec::::new()); + + // Duplicates OK. Just adds one. + app.execute_contract( + Addr::unchecked(gov_addr.clone()), + gov_addr.clone(), + &ExecuteMsg::UpdateCw721List { + to_add: vec![ + another_cw721.to_string(), + cw721_addr.to_string(), + cw721_addr.to_string(), + ], + to_remove: vec![], + }, + &[], + ) + .unwrap(); + + let cw20_list: Vec = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::Cw721TokenList { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(cw20_list, vec![another_cw721, cw721_addr]); +} + +#[test] +fn test_pause() { + let (core_addr, mut app) = do_standard_instantiate(false, None); + + let start_height = app.block_info().height; + + let proposal_modules: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!(paused, PauseInfoResponse::Unpaused {}); + let all_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) + .unwrap(); + assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + + // DAO is not paused. Check that we can execute things. + // + // Tests intentionally use the core address to send these + // messsages to simulate a worst case scenerio where the core + // contract has a vulnerability. + app.execute_contract( + core_addr.clone(), + core_addr.clone(), + &ExecuteMsg::UpdateConfig { + config: Config { + dao_uri: None, + name: "The Empire Strikes Back".to_string(), + description: "haha lol we have pwned your DAO".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }, + }, + &[], + ) + .unwrap(); + + // Oh no the DAO is under attack! Quick! Pause the DAO while we + // figure out what to do! + let err: ContractError = app + .execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::Pause { + duration: Duration::Height(10), + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + + // Only the DAO may call this on itself. Proposal modules must use + // the execute hook. + assert_eq!(err, ContractError::Unauthorized {}); + + app.execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ) + .unwrap(); + + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!( + paused, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + let all_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) + .unwrap(); + assert_eq!( + all_state.pause_info, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + + // This should actually be allowed to enable the admin to execute + let result = app.execute_contract( + core_addr.clone(), + core_addr.clone(), + &ExecuteMsg::UpdateConfig { + config: Config { + dao_uri: None, + name: "The Empire Strikes Back Again".to_string(), + description: "haha lol we have pwned your DAO again".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }, + }, + &[], + ); + assert!(result.is_ok()); + + let err: ContractError = app + .execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + + assert!(matches!(err, ContractError::Paused { .. })); + + app.update_block(|block| block.height += 9); + + // Still not unpaused. + let err: ContractError = app + .execute_contract( + proposal_module.address.clone(), + core_addr.clone(), + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ) + .unwrap_err() + .downcast() + .unwrap(); + + assert!(matches!(err, ContractError::Paused { .. })); + + app.update_block(|block| block.height += 1); + + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!(paused, PauseInfoResponse::Unpaused {}); + let all_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) + .unwrap(); + assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + + // Now its unpaused so we should be able to pause again. + app.execute_contract( + proposal_module.address, + core_addr.clone(), + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![WasmMsg::Execute { + contract_addr: core_addr.to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()], + }, + &[], + ) + .unwrap(); + + let paused: PauseInfoResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + .unwrap(); + assert_eq!( + paused, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 20) + } + ); + let all_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) + .unwrap(); + assert_eq!( + all_state.pause_info, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 20) + } + ); +} + +#[test] +fn test_dump_state_proposal_modules() { + let (core_addr, app) = do_standard_instantiate(false, None); + let proposal_modules: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + let all_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) + .unwrap(); + assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + assert_eq!(all_state.proposal_modules.len(), 1); + assert_eq!(all_state.proposal_modules[0], proposal_module); +} + +// Note that this isn't actually testing that we are migrating from the previous version since +// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, +// this just tests the idempotency of migrate. +#[test] +fn test_migrate_from_compatible() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let voting_id = app.store_code(cw20_balances_voting()); + let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20_id, + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: CREATOR_ADDR.to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + // Instantiate the core module with an admin to do migrations. + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: voting_id, + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + let core_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + Some(CREATOR_ADDR.to_string()), + ) + .unwrap(); + + let state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) + .unwrap(); + + app.execute( + Addr::unchecked(CREATOR_ADDR), + CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: core_addr.to_string(), + new_code_id: gov_id, + msg: to_json_binary(&MigrateMsg::FromCompatible {}).unwrap(), + }), + ) + .unwrap(); + + let new_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) + .unwrap(); + + assert_eq!(new_state, state); +} + +#[test] +fn test_migrate_from_beta() { + use cw_core_v1 as v1; + + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let voting_id = app.store_code(cw20_balances_voting()); + let core_id = app.store_code(cw_core_contract()); + let v1_core_id = app.store_code(v1_cw_core_contract()); + let cw20_id = app.store_code(cw20_contract()); + + let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20_id, + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: CREATOR_ADDR.to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + // Instantiate the core module with an admin to do migrations. + let v1_core_instantiate = v1::msg::InstantiateMsg { + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { + code_id: voting_id, + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ + v1::msg::ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&proposal_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "governance module 1".to_string(), + }, + v1::msg::ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&proposal_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "governance module 2".to_string(), + }, + ], + initial_items: None, + }; + + let core_addr = app + .instantiate_contract( + v1_core_id, + Addr::unchecked(CREATOR_ADDR), + &v1_core_instantiate, + &[], + "cw-governance", + Some(CREATOR_ADDR.to_string()), + ) + .unwrap(); + + app.execute( + Addr::unchecked(CREATOR_ADDR), + CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: core_addr.to_string(), + new_code_id: core_id, + msg: to_json_binary(&MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }) + .unwrap(), + }), + ) + .unwrap(); + + let new_state: DumpStateResponse = app + .wrap() + .query_wasm_smart(&core_addr, &QueryMsg::DumpState {}) + .unwrap(); + + let proposal_modules = new_state.proposal_modules; + assert_eq!(2, proposal_modules.len()); + for (idx, module) in proposal_modules.iter().enumerate() { + let prefix = derive_proposal_module_prefix(idx).unwrap(); + assert_eq!(prefix, module.prefix); + assert_eq!(ProposalModuleStatus::Enabled, module.status); + } + + // Check that we may not migrate more than once. + let err: ContractError = app + .execute( + Addr::unchecked(CREATOR_ADDR), + CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: core_addr.to_string(), + new_code_id: core_id, + msg: to_json_binary(&MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }) + .unwrap(), + }), + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::AlreadyMigrated {}) +} + +#[test] +fn test_migrate_mock() { + let mut deps = mock_dependencies(); + let dao_uri: String = "/dao/uri".to_string(); + let msg = MigrateMsg::FromV1 { + dao_uri: Some(dao_uri.clone()), + params: None, + }; + let env = mock_env(); + + // Set starting version to v1. + set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); + + // Write to storage in old proposal module format + let proposal_modules_key = Addr::unchecked("addr"); + let old_map: Map = Map::new("proposal_modules"); + let path = old_map.key(proposal_modules_key.clone()); + deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); + + // Write to storage in old config format + #[cw_serde] + struct V1Config { + pub name: String, + pub description: String, + pub image_url: Option, + pub automatically_add_cw20s: bool, + pub automatically_add_cw721s: bool, + } + + let v1_config = V1Config { + name: "core dao".to_string(), + description: "a dao".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + }; + + let config_item: Item = Item::new("config"); + config_item.save(&mut deps.storage, &v1_config).unwrap(); + + // Migrate to v2 + migrate(deps.as_mut(), env, msg).unwrap(); + + let new_path = PROPOSAL_MODULES.key(proposal_modules_key); + let prop_module_bytes = deps.storage.get(&new_path).unwrap(); + let module: ProposalModule = from_json(prop_module_bytes).unwrap(); + assert_eq!(module.address, Addr::unchecked("addr")); + assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); + assert_eq!(module.status, ProposalModuleStatus::Enabled {}); + + let v2_config_item: Item = Item::new("config_v2"); + let v2_config = v2_config_item.load(&deps.storage).unwrap(); + assert_eq!(v2_config.dao_uri, Some(dao_uri)); + assert_eq!(v2_config.name, v1_config.name); + assert_eq!(v2_config.description, v1_config.description); + assert_eq!(v2_config.image_url, v1_config.image_url); + assert_eq!( + v2_config.automatically_add_cw20s, + v1_config.automatically_add_cw20s + ); + assert_eq!( + v2_config.automatically_add_cw721s, + v1_config.automatically_add_cw721s + ) +} + +#[test] +fn test_execute_stargate_msg() { + let (core_addr, mut app) = do_standard_instantiate(true, None); + let proposal_modules: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + let res = app.execute_contract( + proposal_module.address, + core_addr, + &ExecuteMsg::ExecuteProposalHook { + msgs: vec![CosmosMsg::Stargate { + type_url: "foo_type".to_string(), + value: to_json_binary("foo_bin").unwrap(), + }], + }, + &[], + ); + // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert + assert!(res.is_err()); +} + +#[test] +fn test_module_prefixes() { + let mut app = App::default(); + let govmod_id = app.store_code(sudo_proposal_contract()); + let gov_id = app.store_code(cw_core_contract()); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: CREATOR_ADDR.to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 1".to_string(), + }, + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 2".to_string(), + }, + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 2".to_string(), + }, + ], + initial_items: None, + }; + + let gov_addr = app + .instantiate_contract( + gov_id, + Addr::unchecked(CREATOR_ADDR), + &gov_instantiate, + &[], + "cw-governance", + None, + ) + .unwrap(); + + let modules: Vec = app + .wrap() + .query_wasm_smart( + gov_addr, + &QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(modules.len(), 3); + + let module_1 = &modules[0]; + assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_1.prefix, "A"); + assert_eq!(&module_1.address, &modules[0].address); + + let module_2 = &modules[1]; + assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_2.prefix, "B"); + assert_eq!(&module_2.address, &modules[1].address); + + let module_3 = &modules[2]; + assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_3.prefix, "C"); + assert_eq!(&module_3.address, &modules[2].address); +} + +fn get_active_modules(gov: &DaoDaoCore) -> Vec { + let modules = gov.proposal_modules(None, None).unwrap(); + + modules + .into_iter() + .filter(|module: &ProposalModule| module.status == ProposalModuleStatus::Enabled) + .collect() +} + +#[test] +fn test_add_remove_subdaos() { + let (core_addr, mut app) = do_standard_instantiate(false, None); + + test_unauthorized( + &mut app, + core_addr.clone(), + ExecuteMsg::UpdateSubDaos { + to_add: vec![], + to_remove: vec![], + }, + ); + + let to_add: Vec = vec![ + SubDao { + addr: "subdao001".to_string(), + charter: None, + }, + SubDao { + addr: "subdao002".to_string(), + charter: Some("cool charter bro".to_string()), + }, + SubDao { + addr: "subdao005".to_string(), + charter: None, + }, + SubDao { + addr: "subdao007".to_string(), + charter: None, + }, + ]; + let to_remove: Vec = vec![]; + + app.execute_contract( + Addr::unchecked(core_addr.clone()), + core_addr.clone(), + &ExecuteMsg::UpdateSubDaos { to_add, to_remove }, + &[], + ) + .unwrap(); + + let res: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &QueryMsg::ListSubDaos { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(res.len(), 4); + + let to_remove: Vec = vec!["subdao005".to_string()]; + + app.execute_contract( + Addr::unchecked(core_addr.clone()), + core_addr.clone(), + &ExecuteMsg::UpdateSubDaos { + to_add: vec![], + to_remove, + }, + &[], + ) + .unwrap(); + + let res: Vec = app + .wrap() + .query_wasm_smart( + core_addr, + &QueryMsg::ListSubDaos { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + assert_eq!(res.len(), 3); + + let test_res: SubDao = SubDao { + addr: "subdao002".to_string(), + charter: Some("cool charter bro".to_string()), + }; + + assert_eq!(res[1], test_res); + + let full_result_set: Vec = vec![ + SubDao { + addr: "subdao001".to_string(), + charter: None, + }, + SubDao { + addr: "subdao002".to_string(), + charter: Some("cool charter bro".to_string()), + }, + SubDao { + addr: "subdao007".to_string(), + charter: None, + }, + ]; + + assert_eq!(res, full_result_set); +} + +#[test] +pub fn test_migrate_update_version() { + let mut deps = mock_dependencies(); + cw2::set_contract_version(&mut deps.storage, "my-contract", "old-version").unwrap(); + migrate(deps.as_mut(), mock_env(), MigrateMsg::FromCompatible {}).unwrap(); + let version = cw2::get_contract_version(&deps.storage).unwrap(); + assert_eq!(version.version, CONTRACT_VERSION); + assert_eq!(version.contract, CONTRACT_NAME); +} + +#[test] +fn test_query_info() { + let (core_addr, app) = do_standard_instantiate(true, None); + let res: InfoResponse = app + .wrap() + .query_wasm_smart(core_addr, &QueryMsg::Info {}) + .unwrap(); + assert_eq!( + res, + InfoResponse { + info: ContractVersion { + contract: CONTRACT_NAME.to_string(), + version: CONTRACT_VERSION.to_string() + } + } + ) +} diff --git a/contracts/dao-dao-core/src/lib.rs b/contracts/dao-dao-core/src/lib.rs index 20a9a57d7..e1d62aad4 100644 --- a/contracts/dao-dao-core/src/lib.rs +++ b/contracts/dao-dao-core/src/lib.rs @@ -4,6 +4,8 @@ pub mod contract; mod error; pub mod state; +#[cfg(test)] +mod cw_orch_tests; #[cfg(test)] mod tests; diff --git a/contracts/test/dao-proposal-sudo/Cargo.toml b/contracts/test/dao-proposal-sudo/Cargo.toml index f6e51f0de..87f102efc 100644 --- a/contracts/test/dao-proposal-sudo/Cargo.toml +++ b/contracts/test/dao-proposal-sudo/Cargo.toml @@ -24,6 +24,7 @@ cw2 = { workspace = true } thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } +cw-orch = "0.22.2" [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/test/dao-proposal-sudo/src/msg.rs b/contracts/test/dao-proposal-sudo/src/msg.rs index 142148400..de00f94ad 100644 --- a/contracts/test/dao-proposal-sudo/src/msg.rs +++ b/contracts/test/dao-proposal-sudo/src/msg.rs @@ -7,12 +7,14 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { + #[fn_name("proposal_execute")] Execute { msgs: Vec }, } #[cw_serde] -#[derive(QueryResponses)] +#[derive(cw_orch::QueryFns, QueryResponses)] pub enum QueryMsg { #[returns(cosmwasm_std::Addr)] Admin {}, diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml new file mode 100644 index 000000000..8c27bfdde --- /dev/null +++ b/packages/cw-orch/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "dao-cw-orch" +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +cw-orch = { version = "0.22.2" } +cw20-stake = { version = "2.4.2", path = "../../contracts/staking/cw20-stake" } +cw20-stake-external-rewards = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-external-rewards" } +cw20-stake-reward-distributor = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-reward-distributor" } +dao-dao-core = { version = "2.4.2", path = "../../contracts/dao-dao-core" } +dao-interface = { version = "2.4.2", path = "../dao-interface" } +dao-pre-propose-approval-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approval-single" } +dao-pre-propose-approver = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approver" } +dao-pre-propose-multiple = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-multiple" } +dao-pre-propose-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-single" } +dao-proposal-condorcet = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-condorcet" } +dao-proposal-hook-counter = { version = "2.4.2", path = "../../contracts/test/dao-proposal-hook-counter" } +dao-proposal-multiple = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-multiple" } +dao-proposal-single = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-single" } +dao-proposal-sudo = { version = "2.4.2", path = "../../contracts/test/dao-proposal-sudo" } +dao-test-custom-factory = { version = "2.4.2", path = "../../contracts/test/dao-test-custom-factory" } +dao-voting-cw20-balance = { version = "2.4.2", path = "../../contracts/test/dao-voting-cw20-balance" } +dao-voting-cw20-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw20-staked" } +dao-voting-cw4 = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw4" } +dao-voting-cw721-roles = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-roles" } +dao-voting-cw721-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-staked" } +dao-voting-token-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-token-staked" } diff --git a/packages/cw-orch/src/core.rs b/packages/cw-orch/src/core.rs new file mode 100644 index 000000000..501d56f4e --- /dev/null +++ b/packages/cw-orch/src/core.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_dao_core::contract::{execute, instantiate, migrate, query, reply}; +use dao_interface::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoDaoCore; + +impl Uploadable for DaoDaoCore { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_dao_core") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_migrate(migrate) + .with_reply(reply), + ) + } +} diff --git a/packages/cw-orch/src/lib.rs b/packages/cw-orch/src/lib.rs new file mode 100644 index 000000000..9d99e4775 --- /dev/null +++ b/packages/cw-orch/src/lib.rs @@ -0,0 +1,16 @@ +mod core; +mod pre_propose; +mod proposal; +mod staking; +mod test_contracts; +mod voting; + +pub use core::*; +pub use pre_propose::*; +pub use proposal::*; +pub use staking::*; +pub use test_contracts::*; +pub use voting::*; + +#[cfg(test)] +pub mod tests; diff --git a/packages/cw-orch/src/pre_propose/approval_single.rs b/packages/cw-orch/src/pre_propose/approval_single.rs new file mode 100644 index 000000000..98b9927f6 --- /dev/null +++ b/packages/cw-orch/src/pre_propose/approval_single.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_pre_propose_approval_single::contract::{execute, instantiate, query}; +use dao_pre_propose_approval_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoPreProposeApprovalSingle; + +impl Uploadable for DaoPreProposeApprovalSingle { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_pre_propose_approval_single") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/pre_propose/approver.rs b/packages/cw-orch/src/pre_propose/approver.rs new file mode 100644 index 000000000..cebd7c13a --- /dev/null +++ b/packages/cw-orch/src/pre_propose/approver.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_pre_propose_approver::contract::{execute, instantiate, query}; +use dao_pre_propose_approver::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoPreProposeApprover; + +impl Uploadable for DaoPreProposeApprover { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_pre_propose_approver") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/pre_propose/mod.rs b/packages/cw-orch/src/pre_propose/mod.rs new file mode 100644 index 000000000..64ccef2f2 --- /dev/null +++ b/packages/cw-orch/src/pre_propose/mod.rs @@ -0,0 +1,9 @@ +mod approval_single; +mod approver; +mod multiple; +mod single; + +pub use approval_single::DaoPreProposeApprovalSingle; +pub use approver::DaoPreProposeApprover; +pub use multiple::DaoPreProposeMultiple; +pub use single::DaoPreProposeSingle; diff --git a/packages/cw-orch/src/pre_propose/multiple.rs b/packages/cw-orch/src/pre_propose/multiple.rs new file mode 100644 index 000000000..7517df320 --- /dev/null +++ b/packages/cw-orch/src/pre_propose/multiple.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_pre_propose_multiple::contract::{execute, instantiate, query}; +use dao_pre_propose_multiple::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoPreProposeMultiple; + +impl Uploadable for DaoPreProposeMultiple { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_pre_propose_multiple") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/pre_propose/single.rs b/packages/cw-orch/src/pre_propose/single.rs new file mode 100644 index 000000000..891654455 --- /dev/null +++ b/packages/cw-orch/src/pre_propose/single.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_pre_propose_single::contract::{execute, instantiate, query}; +use dao_pre_propose_single::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoPreProposeSingle; + +impl Uploadable for DaoPreProposeSingle { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_pre_propose_single") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/proposal/condorcet.rs b/packages/cw-orch/src/proposal/condorcet.rs new file mode 100644 index 000000000..fdfb8fb50 --- /dev/null +++ b/packages/cw-orch/src/proposal/condorcet.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_proposal_condorcet::contract::{execute, instantiate, query, reply}; +use dao_proposal_condorcet::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoProposalCondorcet; + +impl Uploadable for DaoProposalCondorcet { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_proposal_condorcet") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/proposal/mod.rs b/packages/cw-orch/src/proposal/mod.rs new file mode 100644 index 000000000..faf0b7796 --- /dev/null +++ b/packages/cw-orch/src/proposal/mod.rs @@ -0,0 +1,7 @@ +mod condorcet; +mod multiple; +mod single; + +pub use condorcet::DaoProposalCondorcet; +pub use multiple::DaoProposalMultiple; +pub use single::DaoProposalSingle; diff --git a/packages/cw-orch/src/proposal/multiple.rs b/packages/cw-orch/src/proposal/multiple.rs new file mode 100644 index 000000000..dc28e8ef0 --- /dev/null +++ b/packages/cw-orch/src/proposal/multiple.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_proposal_multiple::contract::{execute, instantiate, migrate, query, reply}; +use dao_proposal_multiple::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoProposalMultiple; + +impl Uploadable for DaoProposalMultiple { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_proposal_multiple") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/proposal/single.rs b/packages/cw-orch/src/proposal/single.rs new file mode 100644 index 000000000..7db09ee3b --- /dev/null +++ b/packages/cw-orch/src/proposal/single.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_proposal_single::contract::{execute, instantiate, migrate, query, reply}; +use dao_proposal_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoProposalSingle; + +impl Uploadable for DaoProposalSingle { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_proposal_single") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/staking/cw20_stake.rs b/packages/cw-orch/src/staking/cw20_stake.rs new file mode 100644 index 000000000..8b43d844c --- /dev/null +++ b/packages/cw-orch/src/staking/cw20_stake.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw20_stake::contract::{execute, instantiate, migrate, query}; +use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct Cw20Stake; + +impl Uploadable for Cw20Stake { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("cw20_stake") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_migrate(migrate)) + } +} diff --git a/packages/cw-orch/src/staking/external_rewards.rs b/packages/cw-orch/src/staking/external_rewards.rs new file mode 100644 index 000000000..0d4f19c5c --- /dev/null +++ b/packages/cw-orch/src/staking/external_rewards.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw20_stake_external_rewards::contract::{execute, instantiate, migrate, query}; +use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct Cw20StakeExternalRewards; + +impl Uploadable for Cw20StakeExternalRewards { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("cw20_stake_external_rewards") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_migrate(migrate)) + } +} diff --git a/packages/cw-orch/src/staking/mod.rs b/packages/cw-orch/src/staking/mod.rs new file mode 100644 index 000000000..41808494c --- /dev/null +++ b/packages/cw-orch/src/staking/mod.rs @@ -0,0 +1,7 @@ +mod cw20_stake; +mod external_rewards; +mod reward_distributor; + +pub use cw20_stake::Cw20Stake; +pub use external_rewards::Cw20StakeExternalRewards; +pub use reward_distributor::Cw20StakeRewardDistributor; diff --git a/packages/cw-orch/src/staking/reward_distributor.rs b/packages/cw-orch/src/staking/reward_distributor.rs new file mode 100644 index 000000000..2f398ca81 --- /dev/null +++ b/packages/cw-orch/src/staking/reward_distributor.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw20_stake_reward_distributor::contract::{execute, instantiate, migrate, query}; +use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct Cw20StakeRewardDistributor; + +impl Uploadable for Cw20StakeRewardDistributor { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("cw20_stake_reward_distributor") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_migrate(migrate)) + } +} diff --git a/packages/cw-orch/src/test_contracts/mod.rs b/packages/cw-orch/src/test_contracts/mod.rs new file mode 100644 index 000000000..ac82e1634 --- /dev/null +++ b/packages/cw-orch/src/test_contracts/mod.rs @@ -0,0 +1,9 @@ +mod proposal_hook_counter; +mod proposal_sudo; +mod test_custom_factory; +mod voting_cw20_balance; + +pub use proposal_hook_counter::DaoProposalHookCounter; +pub use proposal_sudo::DaoProposalSudo; +pub use test_custom_factory::DaoTestCustomFactory; +pub use voting_cw20_balance::DaoVotingCw20Balance; diff --git a/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs new file mode 100644 index 000000000..7dc26654e --- /dev/null +++ b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_proposal_hook_counter::contract::{execute, instantiate, query}; +use dao_proposal_hook_counter::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoProposalHookCounter; + +impl Uploadable for DaoProposalHookCounter { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_proposal_hook_counter") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/test_contracts/proposal_sudo.rs b/packages/cw-orch/src/test_contracts/proposal_sudo.rs new file mode 100644 index 000000000..bd623624a --- /dev/null +++ b/packages/cw-orch/src/test_contracts/proposal_sudo.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_proposal_sudo::contract::{execute, instantiate, query}; +use dao_proposal_sudo::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoProposalSudo; + +impl Uploadable for DaoProposalSudo { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_proposal_sudo") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/test_contracts/test_custom_factory.rs b/packages/cw-orch/src/test_contracts/test_custom_factory.rs new file mode 100644 index 000000000..3424df887 --- /dev/null +++ b/packages/cw-orch/src/test_contracts/test_custom_factory.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_test_custom_factory::contract::{execute, instantiate, query, reply}; +use dao_test_custom_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoTestCustomFactory; + +impl Uploadable for DaoTestCustomFactory { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_test_custom_factory") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs new file mode 100644 index 000000000..fdf7b84c0 --- /dev/null +++ b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_cw20_balance::contract::{execute, instantiate, query, reply}; +use dao_voting_cw20_balance::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoVotingCw20Balance; + +impl Uploadable for DaoVotingCw20Balance { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_cw20_balance") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/tests.rs b/packages/cw-orch/src/tests.rs new file mode 100644 index 000000000..82d254fb2 --- /dev/null +++ b/packages/cw-orch/src/tests.rs @@ -0,0 +1,69 @@ +use std::collections::HashSet; + +use cw_orch::{ + contract::interface_traits::Uploadable, + environment::{ChainInfo, ChainKind, NetworkInfo}, + mock::Mock, +}; + +use crate::{ + Cw20Stake, Cw20StakeExternalRewards, Cw20StakeRewardDistributor, DaoDaoCore,DaoVotingCw20Balance, + DaoPreProposeApprovalSingle, DaoPreProposeApprover, DaoPreProposeMultiple, DaoPreProposeSingle, + DaoProposalCondorcet, DaoProposalHookCounter, DaoProposalMultiple, DaoProposalSingle, + DaoProposalSudo, DaoTestCustomFactory, DaoVotingCw20Staked, DaoVotingCw4, DaoVotingCw721Roles, + DaoVotingCw721Staked, DaoVotingTokenStaked, +}; + +pub const DUMMY_CHAIN_INFO: ChainInfo = ChainInfo { + chain_id: "mock-1", + gas_denom: "none", + gas_price: 0.0, + grpc_urls: &[], + lcd_url: None, + fcd_url: None, + network_info: NetworkInfo { + chain_name: "mock", + pub_address_prefix: "mock", + coin_type: 118, + }, + kind: ChainKind::Local, +}; + +#[test] +fn test_all_wasms_different() { + let all_paths = vec![ + // CORE + DaoDaoCore::::wasm(&DUMMY_CHAIN_INFO.into()), + // PRE-PROPOSE + DaoPreProposeApprovalSingle::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoPreProposeApprover::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoPreProposeMultiple::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoPreProposeSingle::::wasm(&DUMMY_CHAIN_INFO.into()), + // PROPOSAL + DaoProposalCondorcet::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoProposalMultiple::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoProposalSingle::::wasm(&DUMMY_CHAIN_INFO.into()), + // Stake + Cw20Stake::::wasm(&DUMMY_CHAIN_INFO.into()), + Cw20StakeExternalRewards::::wasm(&DUMMY_CHAIN_INFO.into()), + Cw20StakeRewardDistributor::::wasm(&DUMMY_CHAIN_INFO.into()), + // Voting + DaoVotingCw4::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoVotingCw20Staked::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoVotingCw721Staked::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoVotingCw721Roles::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoVotingTokenStaked::::wasm(&DUMMY_CHAIN_INFO.into()), + // Test + DaoProposalHookCounter::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoProposalSudo::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoTestCustomFactory::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoVotingCw20Balance::::wasm(&DUMMY_CHAIN_INFO.into()), + ]; + let all_paths: Vec<_> = all_paths + .into_iter() + .map(|path| path.path().as_os_str().to_string_lossy().to_string()) + .collect(); + + let mut uniq = HashSet::new(); + assert!(all_paths.into_iter().all(move |x| uniq.insert(x))); +} diff --git a/packages/cw-orch/src/voting/cw20_staked.rs b/packages/cw-orch/src/voting/cw20_staked.rs new file mode 100644 index 000000000..1f044a913 --- /dev/null +++ b/packages/cw-orch/src/voting/cw20_staked.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_cw20_staked::contract::{execute, instantiate, migrate, query, reply}; +use dao_voting_cw20_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoVotingCw20Staked; + +impl Uploadable for DaoVotingCw20Staked { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_cw20_staked") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/voting/cw4.rs b/packages/cw-orch/src/voting/cw4.rs new file mode 100644 index 000000000..11dfac5ea --- /dev/null +++ b/packages/cw-orch/src/voting/cw4.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_cw4::contract::{execute, instantiate, migrate, query, reply}; +use dao_voting_cw4::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoVotingCw4; + +impl Uploadable for DaoVotingCw4 { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_cw4") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/voting/cw721_roles.rs b/packages/cw-orch/src/voting/cw721_roles.rs new file mode 100644 index 000000000..6469a0887 --- /dev/null +++ b/packages/cw-orch/src/voting/cw721_roles.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_cw721_roles::contract::{execute, instantiate, query, reply}; +use dao_voting_cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoVotingCw721Roles; + +impl Uploadable for DaoVotingCw721Roles { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_cw721_roles") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/voting/cw721_staked.rs b/packages/cw-orch/src/voting/cw721_staked.rs new file mode 100644 index 000000000..5ed2f1ce1 --- /dev/null +++ b/packages/cw-orch/src/voting/cw721_staked.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_cw721_staked::contract::{execute, instantiate, migrate, query, reply}; +use dao_voting_cw721_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoVotingCw721Staked; + +impl Uploadable for DaoVotingCw721Staked { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_cw721_staked") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/voting/mod.rs b/packages/cw-orch/src/voting/mod.rs new file mode 100644 index 000000000..41e697927 --- /dev/null +++ b/packages/cw-orch/src/voting/mod.rs @@ -0,0 +1,11 @@ +mod cw20_staked; +mod cw4; +mod cw721_roles; +mod cw721_staked; +mod token_staked; + +pub use cw20_staked::DaoVotingCw20Staked; +pub use cw4::DaoVotingCw4; +pub use cw721_roles::DaoVotingCw721Roles; +pub use cw721_staked::DaoVotingCw721Staked; +pub use token_staked::DaoVotingTokenStaked; diff --git a/packages/cw-orch/src/voting/token_staked.rs b/packages/cw-orch/src/voting/token_staked.rs new file mode 100644 index 000000000..a8f41ca94 --- /dev/null +++ b/packages/cw-orch/src/voting/token_staked.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use dao_voting_token_staked::contract::{execute, instantiate, migrate, query, reply}; +use dao_voting_token_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoVotingTokenStaked; + +impl Uploadable for DaoVotingTokenStaked { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_voting_token_staked") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/dao-interface/Cargo.toml b/packages/dao-interface/Cargo.toml index 643c84df3..62252d894 100644 --- a/packages/dao-interface/Cargo.toml +++ b/packages/dao-interface/Cargo.toml @@ -15,6 +15,7 @@ cw20 = { workspace = true } cw721 = { workspace = true } cw-utils = { workspace = true } osmosis-std = { workspace = true } +cw-orch = "0.22.2" [dev-dependencies] cosmwasm-schema = { workspace = true } diff --git a/packages/dao-interface/src/lib.rs b/packages/dao-interface/src/lib.rs index aae0678fd..d410b5b68 100644 --- a/packages/dao-interface/src/lib.rs +++ b/packages/dao-interface/src/lib.rs @@ -8,3 +8,6 @@ pub mod query; pub mod state; pub mod token; pub mod voting; + +pub use msg::ExecuteMsgFns as CoreExecuteMsgFns; +pub use msg::QueryMsgFns as CoreQueryMsgFns; diff --git a/packages/dao-interface/src/msg.rs b/packages/dao-interface/src/msg.rs index 969288433..3e650b8ce 100644 --- a/packages/dao-interface/src/msg.rs +++ b/packages/dao-interface/src/msg.rs @@ -53,6 +53,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Callable by the Admin, if one is configured. /// Executes messages in order. @@ -134,7 +135,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Get's the DAO's admin. Returns `Addr`. #[returns(cosmwasm_std::Addr)] From 5fa3d4465a6bbaa2e9c70d5390bbef35aa517bb1 Mon Sep 17 00:00:00 2001 From: Kayanski Date: Thu, 16 May 2024 17:24:41 +0000 Subject: [PATCH 02/50] Added tests with cw-orch --- contracts/dao-dao-core/src/cw_orch_tests.rs | 550 ++++++++------------ 1 file changed, 203 insertions(+), 347 deletions(-) diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs index ebfd8eb58..1bc816c65 100644 --- a/contracts/dao-dao-core/src/cw_orch_tests.rs +++ b/contracts/dao-dao-core/src/cw_orch_tests.rs @@ -15,7 +15,8 @@ use cw_multi_test::{App, Contract, ContractWrapper, Executor}; use cw_orch::prelude::*; use cw_storage_plus::{Item, Map}; use cw_utils::{Duration, Expiration}; -use dao_cw_orch::{DaoDaoCore, DaoProposalSudo}; +use dao_cw_orch::{DaoDaoCore, DaoProposalSudo, DaoVotingCw20Balance}; +use dao_interface::CoreExecuteMsgFns; use dao_interface::CoreQueryMsgFns; use dao_interface::{ msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg, QueryMsg}, @@ -27,7 +28,6 @@ use dao_interface::{ voting::{InfoResponse, VotingPowerAtHeightResponse}, }; use dao_proposal_sudo::msg::ExecuteMsgFns as _; - const CREATOR_ADDR: &str = "creator"; fn cw20_contract() -> Box> { @@ -540,9 +540,12 @@ fn test_removed_modules_can_not_execute() { .into()]) .unwrap_err(); - println!("{}", err); - assert!(format!("{:?}", err) - .contains("Proposal module with address is disabled and cannot execute messages")); + assert!(format!("{:?}", err).contains( + &ContractError::ModuleDisabledCannotExecute { + address: Addr::unchecked("") + } + .to_string() + )); // Check that the enabled query works. let enabled_modules = gov.active_proposal_modules(None, None).unwrap(); @@ -563,9 +566,12 @@ fn test_removed_modules_can_not_execute() { #[test] fn test_module_already_disabled() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -596,78 +602,53 @@ fn test_module_already_disabled() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); - + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); let start_module = modules.into_iter().next().unwrap(); + gov_mod.set_address(&start_module.address); let to_disable = vec![ start_module.address.to_string(), start_module.address.to_string(), ]; - let err: ContractError = app - .execute_contract( - Addr::unchecked(CREATOR_ADDR), - start_module.address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), + let err = gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { + to_add: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { - to_add: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - to_disable, - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); + label: "governance module".to_string(), + }], + to_disable, + }) + .unwrap(), + } + .into()]) + .unwrap_err(); - assert_eq!( - err, - ContractError::ModuleAlreadyDisabled { + assert!(format!("{:?}", err).contains( + &ContractError::ModuleAlreadyDisabled { address: start_module.address } - ) + .to_string() + )); } #[test] fn test_swap_voting_module() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -698,82 +679,48 @@ fn test_swap_voting_module() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let voting_addr: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); - + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); + gov_mod.set_address(&modules[0].address); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - modules[0].address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { - module: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); + let voting_addr = gov.voting_module().unwrap(); - let new_voting_addr: Addr = app - .wrap() - .query_wasm_smart(gov_addr, &QueryMsg::VotingModule {}) + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { + module: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + }) + .unwrap(), + } + .into()]) .unwrap(); - assert_ne!(new_voting_addr, voting_addr); + assert_ne!(gov.voting_module().unwrap(), voting_addr); } -fn test_unauthorized(app: &mut App, gov_addr: Addr, msg: ExecuteMsg) { - let err: ContractError = app - .execute_contract(Addr::unchecked(CREATOR_ADDR), gov_addr, &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); +fn test_unauthorized(gov: &DaoDaoCore, msg: ExecuteMsg) { + let err = gov.execute(&msg, None).unwrap_err(); - assert_eq!(err, ContractError::Unauthorized {}); + assert!(format!("{:?}", err).contains(&ContractError::Unauthorized {}.to_string())); } #[test] fn test_permissions() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -804,20 +751,10 @@ fn test_permissions() { automatically_add_cw721s: true, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); test_unauthorized( - &mut app, - gov_addr.clone(), + &gov, ExecuteMsg::UpdateVotingModule { module: ModuleInstantiateInfo { code_id: govmod_id, @@ -830,8 +767,7 @@ fn test_permissions() { ); test_unauthorized( - &mut app, - gov_addr.clone(), + &gov, ExecuteMsg::UpdateProposalModules { to_add: vec![], to_disable: vec![], @@ -839,8 +775,7 @@ fn test_permissions() { ); test_unauthorized( - &mut app, - gov_addr, + &gov, ExecuteMsg::UpdateConfig { config: Config { dao_uri: None, @@ -854,19 +789,26 @@ fn test_permissions() { ); } -fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); +fn do_standard_instantiate( + auto_add: bool, + admin: Option, +) -> ( + DaoDaoCore, + DaoProposalSudo, + MockBech32, +) { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), @@ -888,14 +830,14 @@ fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) automatically_add_cw20s: auto_add, automatically_add_cw721s: auto_add, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: gov_mod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -904,212 +846,143 @@ fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); - (gov_addr, app) + let proposal_modules = gov.proposal_modules(None, None).unwrap(); + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + gov_mod.set_address(&proposal_module.address); + (gov, gov_mod, mock) } #[test] fn test_admin_permissions() { - let (core_addr, mut app) = do_standard_instantiate(true, None); - - let start_height = app.block_info().height; - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let (core, proposal, mock) = do_standard_instantiate(true, None); - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); + let random = mock.addr_make("random"); + let start_height = mock.block_info().unwrap().height; // Random address can't call ExecuteAdminMsgs - let res = app.execute_contract( - Addr::unchecked("random"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core.call_as(&random) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Proposal module can't call ExecuteAdminMsgs - let res = app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core.call_as(&proposal.address().unwrap()) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Update Admin can't be called by non-admins - let res = app.execute_contract( - Addr::unchecked("rando"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("rando".to_string()), - }, - &[], - ); - res.unwrap_err(); + core.call_as(&random) + .nominate_admin(Some(random.to_string())) + .unwrap(); // Nominate admin can be called by core contract as no admin was // specified so the admin defaulted to the core contract. - let res = app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap(); + + core.call_as(&proposal.address().unwrap()) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // Instantiate new DAO with an admin - let (core_with_admin_addr, mut app) = - do_standard_instantiate(true, Some(Addr::unchecked("admin").to_string())); + let admin = mock.addr_make("admin"); + let (core_with_admin, proposal_with_admin_address, mock) = + do_standard_instantiate(true, Some(admin.to_string())); // Non admins still can't call ExecuteAdminMsgs - let res = app.execute_contract( - proposal_module.address, - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core_with_admin + .call_as(&proposal_with_admin_address.address().unwrap()) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Admin cannot directly pause the DAO - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), - }, - &[], - ); - assert!(res.is_err()); + core_with_admin + .call_as(&admin) + .pause(Duration::Height(10)) + .unwrap_err(); // Random person cannot pause the DAO - let res = app.execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), - }, - &[], - ); - assert!(res.is_err()); + core_with_admin + .call_as(&random) + .pause(Duration::Height(10)) + .unwrap_err(); // Admin can call ExecuteAdminMsgs, here an admin pauses the DAO - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - assert!(res.is_ok()); + let res = core_with_admin + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // Ensure we are paused for 10 blocks - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); assert_eq!( - paused, + core_with_admin.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); // DAO unpauses after 10 blocks - app.update_block(|block| block.height += 11); + mock.wait_blocks(11); // Check we are unpaused - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); + assert_eq!( + core_with_admin.pause_info().unwrap(), + PauseInfoResponse::Unpaused {} + ); // Admin pauses DAO again - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - assert!(res.is_ok()); + let res = core_with_admin + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // DAO with admin cannot unpause itself let res = app.execute_contract( @@ -2836,9 +2709,12 @@ fn test_execute_stargate_msg() { #[test] fn test_module_prefixes() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -2885,28 +2761,9 @@ fn test_module_prefixes() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 3); let module_1 = &modules[0]; @@ -2939,8 +2796,7 @@ fn test_add_remove_subdaos() { let (core_addr, mut app) = do_standard_instantiate(false, None); test_unauthorized( - &mut app, - core_addr.clone(), + &gov, ExecuteMsg::UpdateSubDaos { to_add: vec![], to_remove: vec![], From 364d12d202daeab38ad74b3d3368cded67a8751a Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 07:40:35 +0000 Subject: [PATCH 03/50] More tests --- Cargo.lock | 5 + contracts/dao-dao-core/Cargo.toml | 2 + contracts/dao-dao-core/src/cw_orch_tests.rs | 2597 ++++++++---------- packages/cw-orch/Cargo.toml | 3 + packages/cw-orch/src/test_contracts/cw721.rs | 20 + packages/cw-orch/src/test_contracts/mod.rs | 2 + packages/dao-interface/src/msg.rs | 4 +- 7 files changed, 1141 insertions(+), 1492 deletions(-) create mode 100644 packages/cw-orch/src/test_contracts/cw721.rs diff --git a/Cargo.lock b/Cargo.lock index 3215472c0..4a7a7648d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2049,10 +2049,12 @@ dependencies = [ name = "dao-cw-orch" version = "2.5.0" dependencies = [ + "cosmwasm-std", "cw-orch", "cw20-stake 2.5.0", "cw20-stake-external-rewards", "cw20-stake-reward-distributor", + "cw721-base 0.18.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-pre-propose-approval-single 2.5.0", @@ -2071,6 +2073,7 @@ dependencies = [ "dao-voting-cw721-roles", "dao-voting-cw721-staked", "dao-voting-token-staked", + "serde", ] [[package]] @@ -2108,6 +2111,8 @@ name = "dao-dao-core" version = "2.5.0" dependencies = [ "abstract-cw-plus-interface", + "abstract-cw20", + "abstract-cw20-base", "cosmwasm-schema", "cosmwasm-std", "cw-core", diff --git a/contracts/dao-dao-core/Cargo.toml b/contracts/dao-dao-core/Cargo.toml index 549f93f98..2f25f621c 100644 --- a/contracts/dao-dao-core/Cargo.toml +++ b/contracts/dao-dao-core/Cargo.toml @@ -32,6 +32,8 @@ cw-core-v1 = { workspace = true, features = ["library"] } [dev-dependencies] abstract-cw-plus-interface = "2.0.1" +abstract-cw20 = "2.0.0" +abstract-cw20-base = "2.0.0" cw-multi-test = { workspace = true } cw-orch = "0.22.2" cw20-base = { workspace = true } diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs index 1bc816c65..340a91851 100644 --- a/contracts/dao-dao-core/src/cw_orch_tests.rs +++ b/contracts/dao-dao-core/src/cw_orch_tests.rs @@ -3,18 +3,20 @@ use crate::{ state::PROPOSAL_MODULES, ContractError, }; +use abstract_cw20::msg::Cw20ExecuteMsgFns; use abstract_cw_plus_interface::cw20_base::Cw20Base; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ from_json, testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, + to_json_binary, Addr, CosmosMsg, Empty, StdError, Storage, Uint128, WasmMsg, }; use cw2::{set_contract_version, ContractVersion}; use cw_multi_test::{App, Contract, ContractWrapper, Executor}; use cw_orch::prelude::*; use cw_storage_plus::{Item, Map}; use cw_utils::{Duration, Expiration}; +use dao_cw_orch::Cw721Base; use dao_cw_orch::{DaoDaoCore, DaoProposalSudo, DaoVotingCw20Balance}; use dao_interface::CoreExecuteMsgFns; use dao_interface::CoreQueryMsgFns; @@ -28,7 +30,10 @@ use dao_interface::{ voting::{InfoResponse, VotingPowerAtHeightResponse}, }; use dao_proposal_sudo::msg::ExecuteMsgFns as _; -const CREATOR_ADDR: &str = "creator"; + +pub fn assert_contains(e: impl std::fmt::Debug, el: impl ToString) { + assert!(format!("{:?}", e).contains(&el.to_string())) +} fn cw20_contract() -> Box> { let contract = ContractWrapper::new( @@ -363,6 +368,8 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { let start_modules = gov.proposal_modules(None, None).unwrap(); let start_modules_active: Vec = get_active_modules(&gov); + + get_active_modules(&gov); gov_mod.set_address(&start_modules_active[0].address.clone()); let to_add: Vec<_> = (0..add) .map(|n| ModuleInstantiateInfo { @@ -540,12 +547,12 @@ fn test_removed_modules_can_not_execute() { .into()]) .unwrap_err(); - assert!(format!("{:?}", err).contains( - &ContractError::ModuleDisabledCannotExecute { - address: Addr::unchecked("") - } - .to_string() - )); + assert_contains( + err, + ContractError::ModuleDisabledCannotExecute { + address: Addr::unchecked(""), + }, + ); // Check that the enabled query works. let enabled_modules = gov.active_proposal_modules(None, None).unwrap(); @@ -574,7 +581,7 @@ fn test_module_already_disabled() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -633,12 +640,12 @@ fn test_module_already_disabled() { .into()]) .unwrap_err(); - assert!(format!("{:?}", err).contains( - &ContractError::ModuleAlreadyDisabled { - address: start_module.address - } - .to_string() - )); + assert_contains( + err, + ContractError::ModuleAlreadyDisabled { + address: start_module.address, + }, + ); } #[test] @@ -651,7 +658,7 @@ fn test_swap_voting_module() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -710,7 +717,7 @@ fn test_swap_voting_module() { fn test_unauthorized(gov: &DaoDaoCore, msg: ExecuteMsg) { let err = gov.execute(&msg, None).unwrap_err(); - assert!(format!("{:?}", err).contains(&ContractError::Unauthorized {}.to_string())); + assert_contains(err, ContractError::Unauthorized {}); } #[test] @@ -723,7 +730,7 @@ fn test_permissions() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -791,18 +798,24 @@ fn test_permissions() { fn do_standard_instantiate( auto_add: bool, - admin: Option, + admin: bool, ) -> ( DaoDaoCore, DaoProposalSudo, MockBech32, + Option, ) { let mock = MockBech32::new("mock"); let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); + let mut gov = DaoDaoCore::new("dao-core", mock.clone()); let cw20 = Cw20Base::new("cw20", mock.clone()); + gov_mod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: mock.sender().to_string(), }; @@ -814,16 +827,17 @@ fn do_standard_instantiate( symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, }, }; + let admin = admin.then(|| mock.addr_make("admin")); let gov_instantiate = InstantiateMsg { dao_uri: None, - admin, + admin: admin.as_ref().map(|a| a.to_string()), name: "DAO DAO".to_string(), description: "A DAO that builds DAOs.".to_string(), image_url: None, @@ -852,12 +866,17 @@ fn do_standard_instantiate( assert_eq!(proposal_modules.len(), 1); let proposal_module = proposal_modules.into_iter().next().unwrap(); gov_mod.set_address(&proposal_module.address); - (gov, gov_mod, mock) + + if admin.is_none() { + gov = gov.call_as(&gov.address().unwrap()); + } + + (gov, gov_mod, mock, admin) } #[test] fn test_admin_permissions() { - let (core, proposal, mock) = do_standard_instantiate(true, None); + let (core, proposal, mock, _) = do_standard_instantiate(true, false); let random = mock.addr_make("random"); let start_height = mock.block_info().unwrap().height; @@ -891,7 +910,7 @@ fn test_admin_permissions() { // Update Admin can't be called by non-admins core.call_as(&random) .nominate_admin(Some(random.to_string())) - .unwrap(); + .unwrap_err(); // Nominate admin can be called by core contract as no admin was // specified so the admin defaulted to the core contract. @@ -909,9 +928,9 @@ fn test_admin_permissions() { .unwrap(); // Instantiate new DAO with an admin - let admin = mock.addr_make("admin"); - let (core_with_admin, proposal_with_admin_address, mock) = - do_standard_instantiate(true, Some(admin.to_string())); + let (core_with_admin, proposal_with_admin_address, mock, admin) = + do_standard_instantiate(true, true); + let admin = admin.unwrap(); // Non admins still can't call ExecuteAdminMsgs core_with_admin @@ -962,7 +981,7 @@ fn test_admin_permissions() { ); // DAO unpauses after 10 blocks - mock.wait_blocks(11); + mock.wait_blocks(11).unwrap(); // Check we are unpaused assert_eq!( @@ -985,350 +1004,201 @@ fn test_admin_permissions() { .unwrap(); // DAO with admin cannot unpause itself - let res = app.execute_contract( - core_with_admin_addr.clone(), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_err()); + let res = core_with_admin + .call_as(&core_with_admin.address().unwrap()) + .unpause() + .unwrap_err(); // Random person cannot unpause the DAO - let res = app.execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_err()); + let res = core_with_admin.call_as(&random).unpause().unwrap_err(); // Admin can unpause the DAO directly - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_ok()); + let res = core_with_admin.call_as(&admin).unpause().unwrap(); // Check we are unpaused - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - // Admin can nominate a new admin. - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }, - &[], + assert_eq!( + core_with_admin.pause_info().unwrap(), + PauseInfoResponse::Unpaused {} ); - res.unwrap(); - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::AdminNomination {}) + // Admin can nominate a new admin. + let new_admin = mock.addr_make("meow"); + core_with_admin + .call_as(&admin) + .nominate_admin(Some(new_admin.to_string())) .unwrap(); + assert_eq!( - nomination, + core_with_admin.admin_nomination().unwrap(), AdminNominationResponse { - nomination: Some(Addr::unchecked("meow")) + nomination: Some(new_admin.clone()) } ); // Check that admin has not yet been updated - let res: Addr = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, Addr::unchecked("admin")); + assert_eq!(core_with_admin.admin().unwrap(), admin); // Only the nominated address may accept the nomination. - let err: ContractError = app - .execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core_with_admin + .call_as(&random) + .accept_admin_nomination() + .unwrap_err(); + + assert_contains(err, ContractError::Unauthorized {}); // Accept the nomination. - app.execute_contract( - Addr::unchecked("meow"), - core_with_admin_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap(); + core_with_admin + .call_as(&new_admin) + .accept_admin_nomination() + .unwrap(); // Check that admin has been updated - let res: Addr = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, Addr::unchecked("meow")); + assert_eq!(core_with_admin.admin().unwrap(), new_admin); // Check that the pending admin has been cleared. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr, &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core_with_admin.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); } #[test] fn test_admin_nomination() { - let (core_addr, mut app) = do_standard_instantiate(true, Some("admin".to_string())); + let (core, _, mock, admin) = do_standard_instantiate(true, true); + let admin = admin.unwrap(); // Check that there is no pending nominations. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Nominate a new admin. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("ekez".to_string()), - }, - &[], - ) - .unwrap(); + let ekez = mock.addr_make("ekez"); + core.call_as(&admin) + .nominate_admin(Some(ekez.to_string())) + .unwrap(); // Check that the nomination is in place. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); assert_eq!( - nomination, + core.admin_nomination().unwrap(), AdminNominationResponse { - nomination: Some(Addr::unchecked("ekez")) + nomination: Some(ekez.clone()) } ); // Non-admin can not withdraw. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core.call_as(&ekez).withdraw_admin_nomination().unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); // Admin can withdraw. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap(); + core.call_as(&admin).withdraw_admin_nomination().unwrap(); // Check that the nomination is withdrawn. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Can not withdraw if no nomination is pending. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::NoAdminNomination {}); + let err = core + .call_as(&admin) + .withdraw_admin_nomination() + .unwrap_err(); + + assert_contains(err, ContractError::NoAdminNomination {}); // Can not claim nomination b/c it has been withdrawn. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::NoAdminNomination {}); + let err = core.call_as(&admin).accept_admin_nomination().unwrap_err(); + + assert_contains(err, ContractError::NoAdminNomination {}); // Nominate a new admin. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }, - &[], - ) - .unwrap(); + let meow = mock.addr_make("meow"); + core.call_as(&admin) + .nominate_admin(Some(meow.to_string())) + .unwrap(); // A new nomination can not be created if there is already a // pending nomination. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("arthur".to_string()), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::PendingNomination {}); + let err = core + .call_as(&admin) + .nominate_admin(Some(ekez.to_string())) + .unwrap_err(); + assert_contains(err, ContractError::PendingNomination {}); // Only nominated admin may accept. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core.call_as(&ekez).accept_admin_nomination().unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); - app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap(); + core.call_as(&meow).accept_admin_nomination().unwrap(); // Check that meow is the new admin. - let admin: Addr = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(admin, Addr::unchecked("meow".to_string())); + assert_eq!(core.admin().unwrap(), meow); - let start_height = app.block_info().height; + let start_height = mock.block_info().unwrap().height; // Check that the new admin can do admin things and the old can not. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); - - let res = app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap(); + let err = core + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + core.call_as(&meow) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) .unwrap(); + assert_eq!( - paused, + core.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); // DAO unpauses after 10 blocks - app.update_block(|block| block.height += 11); + mock.wait_blocks(11).unwrap(); // Remove the admin. - app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { admin: None }, - &[], - ) - .unwrap(); + core.call_as(&meow).nominate_admin(None).unwrap(); // Check that this has not caused an admin to be nominated. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Check that admin has been updated. As there was no admin // nominated the admin should revert back to the contract address. - let res: Addr = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, core_addr); + assert_eq!(core.admin().unwrap(), core.address().unwrap()); } #[test] fn test_passthrough_voting_queries() { - let (gov_addr, app) = do_standard_instantiate(true, None); - - let creator_voting_power: VotingPowerAtHeightResponse = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::VotingPowerAtHeight { - address: CREATOR_ADDR.to_string(), - height: None, - }, - ) - .unwrap(); + let (gov, _, mock, _) = do_standard_instantiate(true, false); assert_eq!( - creator_voting_power, + gov.voting_power_at_height(mock.sender().to_string(), None) + .unwrap(), VotingPowerAtHeightResponse { power: Uint128::from(2u64), - height: app.block_info().height, + height: mock.block_info().unwrap().height, } ); } @@ -1353,77 +1223,31 @@ fn remove_item(app: &mut App, gov_addr: Addr, key: String) { .unwrap(); } -fn get_item(app: &mut App, gov_addr: Addr, key: String) -> GetItemResponse { - app.wrap() - .query_wasm_smart(gov_addr, &QueryMsg::GetItem { key }) - .unwrap() -} - -fn list_items( - app: &mut App, - gov_addr: Addr, - start_at: Option, - limit: Option, -) -> Vec<(String, String)> { - app.wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::ListItems { - start_after: start_at, - limit, - }, - ) - .unwrap() -} - #[test] fn test_item_permissions() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::SetItem { - key: "k".to_string(), - value: "v".to_string(), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); - - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr, - &ExecuteMsg::RemoveItem { - key: "k".to_string(), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let (gov, _, mock, _) = do_standard_instantiate(true, false); + + let ekez = mock.addr_make("ekez"); + let err = gov + .call_as(&ekez) + .set_item("k".to_string(), "v".to_string()) + .unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); + + let err = gov.call_as(&ekez).remove_item("k".to_string()).unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); } #[test] fn test_add_remove_get() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); + let (gov, _, mock, _) = do_standard_instantiate(true, false); - let a = get_item(&mut app, gov_addr.clone(), "aaaaa".to_string()); + let a = gov.get_item("aaaaa".to_string()).unwrap(); assert_eq!(a, GetItemResponse { item: None }); - set_item( - &mut app, - gov_addr.clone(), - "aaaaakey".to_string(), - "aaaaaaddr".to_string(), - ); - let a = get_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); + gov.set_item("aaaaakey".to_string(), "aaaaaaddr".to_string()) + .unwrap(); + let a = gov.get_item("aaaaakey".to_string()).unwrap(); assert_eq!( a, GetItemResponse { @@ -1431,38 +1255,42 @@ fn test_add_remove_get() { } ); - remove_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); - let a = get_item(&mut app, gov_addr, "aaaaakey".to_string()); + gov.remove_item("aaaaakey".to_string()).unwrap(); + let a = gov.get_item("aaaaakey".to_string()).unwrap(); assert_eq!(a, GetItemResponse { item: None }); } #[test] #[should_panic(expected = "Key is missing from storage")] fn test_remove_missing_key() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - remove_item(&mut app, gov_addr, "b".to_string()) + let (gov, _, _, _) = do_standard_instantiate(true, false); + gov.remove_item("b".to_string()).unwrap(); } #[test] fn test_list_items() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1478,14 +1306,14 @@ fn test_list_items() { automatically_add_cw20s: true, automatically_add_cw721s: true, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -1494,64 +1322,41 @@ fn test_list_items() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let gov = gov.call_as(&gov.address().unwrap()); - set_item( - &mut app, - gov_addr.clone(), - "fookey".to_string(), - "fooaddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "barkey".to_string(), - "baraddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "loremkey".to_string(), - "loremaddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "ipsumkey".to_string(), - "ipsumaddr".to_string(), - ); + gov.set_item("fookey".to_string(), "fooaddr".to_string()) + .unwrap(); + gov.set_item("barkey".to_string(), "baraddr".to_string()) + .unwrap(); + gov.set_item("loremkey".to_string(), "loremaddr".to_string()) + .unwrap(); + gov.set_item("ipsumkey".to_string(), "ipsumaddr".to_string()) + .unwrap(); // Foo returned as we are only getting one item and items are in // decending order. - let first_item = list_items(&mut app, gov_addr.clone(), None, Some(1)); + let first_item = gov.list_items(Some(1), None).unwrap(); assert_eq!(first_item.len(), 1); assert_eq!( first_item[0], ("loremkey".to_string(), "loremaddr".to_string()) ); - let no_items = list_items(&mut app, gov_addr.clone(), None, Some(0)); + let no_items = gov.list_items(Some(0), None).unwrap(); assert_eq!(no_items.len(), 0); // Items are retreived in decending order so asking for foo with // no limit ought to give us the barkey k/v. this will be the last item // note: the paginate map bound is exclusive, so fookey will be starting point - let last_item = list_items(&mut app, gov_addr.clone(), Some("foo".to_string()), None); + let last_item = gov.list_items(None, Some("foo".to_string())).unwrap(); + assert_eq!(last_item.len(), 1); assert_eq!(last_item[0], ("barkey".to_string(), "baraddr".to_string())); // Items are retreived in decending order so asking for ipsum with // 4 limit ought to give us the fookey and barkey k/vs. - let after_foo_list = list_items(&mut app, gov_addr, Some("ipsum".to_string()), Some(4)); + let after_foo_list = gov.list_items(Some(4), Some("ipsum".to_string())).unwrap(); assert_eq!(after_foo_list.len(), 2); assert_eq!( after_foo_list, @@ -1564,24 +1369,29 @@ fn test_list_items() { #[test] fn test_instantiate_with_items() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1612,14 +1422,14 @@ fn test_instantiate_with_items() { automatically_add_cw20s: true, automatically_add_cw721s: true, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -1629,45 +1439,26 @@ fn test_instantiate_with_items() { }; // Ensure duplicates are dissallowed. - let err: ContractError = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!( + let err = gov.instantiate(&gov_instantiate, None, None).unwrap_err(); + assert_contains( err, ContractError::DuplicateInitialItem { - item: "item0".to_string() - } + item: "item0".to_string(), + }, ); initial_items.pop(); gov_instantiate.initial_items = Some(initial_items); - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); // Ensure initial items were added. - let items = list_items(&mut app, gov_addr.clone(), None, None); + let items = gov.list_items(None, None).unwrap(); assert_eq!(items.len(), 2); // Descending order, so item1 is first. assert_eq!(items[1].0, "item0".to_string()); - let get_item0 = get_item(&mut app, gov_addr.clone(), "item0".to_string()); + let get_item0 = gov.get_item("item0".to_string()).unwrap(); + assert_eq!( get_item0, GetItemResponse { @@ -1676,20 +1467,18 @@ fn test_instantiate_with_items() { ); assert_eq!(items[0].0, "item1".to_string()); - let item1_value = get_item(&mut app, gov_addr, "item1".to_string()).item; + let item1_value = gov.get_item("item1".to_string()).unwrap().item; assert_eq!(item1_value, Some("item1_value".to_string())) } #[test] fn test_cw20_receive_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let cw20_id = app.store_code(cw20_contract()); - let another_cw20 = app - .instantiate_contract( - cw20_id, - Addr::unchecked(CREATOR_ADDR), - &cw20_base::msg::InstantiateMsg { + let (gov, proposal, mock, _) = do_standard_instantiate(true, false); + let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); + another_cw20.upload().unwrap(); + another_cw20 + .instantiate( + &abstract_cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, @@ -1697,146 +1486,85 @@ fn test_cw20_receive_auto_add() { mint: None, marketing: None, }, - &[], - "another-token", + None, None, ) .unwrap(); - let voting_module: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - let gov_token: Addr = app - .wrap() - .query_wasm_smart( - voting_module, - &dao_interface::voting::Query::TokenContract {}, - ) - .unwrap(); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + voting.set_address(&gov.voting_module().unwrap()); + let gov_token = Cw20Base::new("cw20", mock.clone()); + gov_token.set_address( + &voting + .query(&dao_voting_cw20_balance::msg::QueryMsg::TokenContract {}) + .unwrap(), + ); // Check that the balances query works with no tokens. - let cw20_balances: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20Balances { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let cw20_balances = gov.cw_20_balances(None, None).unwrap(); assert_eq!(cw20_balances, vec![]); // Send a gov token to the governance contract. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - gov_token.clone(), - &cw20::Cw20ExecuteMsg::Send { - contract: gov_addr.to_string(), - amount: Uint128::new(1), - msg: to_json_binary(&"").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![gov_token.clone()]); - - let cw20_balances: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20Balances { - start_after: None, - limit: None, - }, + gov_token + .send( + Uint128::new(1), + gov.address().unwrap().to_string(), + to_json_binary(&"").unwrap(), ) .unwrap(); + + let cw20_list = gov.cw_20_token_list(None, None).unwrap(); + assert_eq!( + cw20_list, + vec![gov_token.address().unwrap().to_string().clone()] + ); + assert_eq!( - cw20_balances, + gov.cw_20_balances(None, None).unwrap(), vec![Cw20BalanceResponse { - addr: gov_token.clone(), + addr: gov_token.address().unwrap(), balance: Uint128::new(1), }] ); // Test removing and adding some new ones. Invalid should fail. - let err: ContractError = app - .execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec!["new".to_string()], - to_remove: vec![gov_token.to_string()], - }, - &[], + let err = gov + .update_cw_20_list( + vec![mock.addr_make("new").to_string()], + vec![gov_token.address().unwrap().to_string()], ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Std(_))); + .unwrap_err(); + println!("{:?}", err); + assert_contains(&err, "key:"); + assert_contains(err, "not found"); // Test that non-DAO can not update the list. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![], - to_remove: vec![gov_token.to_string()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Unauthorized {})); + let err = gov + .call_as(&mock.addr_make("ekez")) + .update_cw_20_list(vec![], vec![gov_token.address().unwrap().to_string()]) + .unwrap_err(); - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![another_cw20.to_string()], - to_remove: vec![gov_token.to_string()], - }, - &[], + assert_contains(err, ContractError::Unauthorized {}); + + gov.update_cw_20_list( + vec![another_cw20.address().unwrap().to_string()], + vec![gov_token.address().unwrap().to_string()], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw20]); + let cw20_list = gov.cw_20_token_list(None, None).unwrap(); + assert_eq!(cw20_list, vec![another_cw20.address().unwrap().to_string()]); } #[test] fn test_cw20_receive_no_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(false, None); - - let cw20_id = app.store_code(cw20_contract()); - let another_cw20 = app - .instantiate_contract( - cw20_id, - Addr::unchecked(CREATOR_ADDR), - &cw20_base::msg::InstantiateMsg { + let (gov, proposal, mock, _) = do_standard_instantiate(false, false); + + let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); + another_cw20.upload().unwrap(); + another_cw20 + .instantiate( + &abstract_cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, @@ -1844,943 +1572,879 @@ fn test_cw20_receive_no_auto_add() { mint: None, marketing: None, }, - &[], - "another-token", + None, None, ) .unwrap(); - let voting_module: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - let gov_token: Addr = app - .wrap() - .query_wasm_smart( - voting_module, - &dao_interface::voting::Query::TokenContract {}, - ) - .unwrap(); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + voting.set_address(&gov.voting_module().unwrap()); + + let gov_token = Cw20Base::new("cw20", mock.clone()); + gov_token.set_address( + &voting + .query(&dao_voting_cw20_balance::msg::QueryMsg::TokenContract {}) + .unwrap(), + ); // Send a gov token to the governance contract. Should not be // added becasue auto add is turned off. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - gov_token.clone(), - &cw20::Cw20ExecuteMsg::Send { - contract: gov_addr.to_string(), - amount: Uint128::new(1), - msg: to_json_binary(&"").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, + gov_token + .send( + Uint128::new(1), + gov.address().unwrap().to_string(), + to_json_binary(&"").unwrap(), ) .unwrap(); - assert_eq!(cw20_list, Vec::::new()); - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![another_cw20.to_string(), gov_token.to_string()], - to_remove: vec!["ok to remove non existent".to_string()], - }, - &[], + assert_eq!( + gov.cw_20_token_list(None, None).unwrap(), + Vec::::new() + ); + + gov.update_cw_20_list( + vec![ + another_cw20.address().unwrap().to_string(), + gov_token.address().unwrap().to_string(), + ], + vec![mock.addr_make("ok to remove non existent").to_string()], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw20, gov_token]); + assert_eq!( + gov.cw_20_token_list(None, None).unwrap(), + vec![ + gov_token.address().unwrap(), + another_cw20.address().unwrap(), + ] + ); } #[test] fn test_cw721_receive() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let cw721_id = app.store_code(cw721_contract()); + let (gov, proposal, mock, _) = do_standard_instantiate(true, false); - let cw721_addr = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let cw721 = Cw721Base::new("cw721", mock.clone()); + cw721.upload().unwrap(); + cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", None, - ) - .unwrap(); - - let another_cw721 = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), - }, - &[], - "cw721", None, ) .unwrap(); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::Mint { - token_id: "ekez".to_string(), - owner: CREATOR_ADDR.to_string(), - token_uri: None, - extension: None, - }, - &[], - ) - .unwrap(); - - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { - contract: gov_addr.to_string(), - token_id: "ekez".to_string(), - msg: to_json_binary("").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw721_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw721_list, vec![cw721_addr.clone()]); - - // Try to add an invalid cw721. - let err: ContractError = app - .execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec!["new".to_string(), cw721_addr.to_string()], - to_remove: vec![cw721_addr.to_string()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Std(_))); - - // Test that non-DAO can not update the list. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![], - to_remove: vec![cw721_addr.to_string()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Unauthorized {})); - - // Add a real cw721. - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![another_cw721.to_string(), cw721_addr.to_string()], - to_remove: vec![cw721_addr.to_string()], - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw721]); -} - -#[test] -fn test_cw721_receive_no_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(false, None); - - let cw721_id = app.store_code(cw721_contract()); - - let cw721_addr = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); + another_cw721.set_code_id(cw721.code_id().unwrap()); + another_cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", None, - ) - .unwrap(); - - let another_cw721 = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), - }, - &[], - "cw721", None, ) .unwrap(); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::Mint { - token_id: "ekez".to_string(), - owner: CREATOR_ADDR.to_string(), - token_uri: None, - extension: None, - }, - &[], - ) - .unwrap(); - - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { - contract: gov_addr.to_string(), - token_id: "ekez".to_string(), - msg: to_json_binary("").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw721_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw721_list, Vec::::new()); - - // Duplicates OK. Just adds one. - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![ - another_cw721.to_string(), - cw721_addr.to_string(), - cw721_addr.to_string(), - ], - to_remove: vec![], - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw721, cw721_addr]); -} - -#[test] -fn test_pause() { - let (core_addr, mut app) = do_standard_instantiate(false, None); - - let start_height = app.block_info().height; - - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, + cw721 + .execute( + &cw721_base::msg::ExecuteMsg::, Empty>::Mint { + token_id: "ekez".to_string(), + owner: mock.sender().to_string(), + token_uri: None, + extension: None, }, + None, ) .unwrap(); - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); - - // DAO is not paused. Check that we can execute things. - // - // Tests intentionally use the core address to send these - // messsages to simulate a worst case scenerio where the core - // contract has a vulnerability. - app.execute_contract( - core_addr.clone(), - core_addr.clone(), - &ExecuteMsg::UpdateConfig { - config: Config { - dao_uri: None, - name: "The Empire Strikes Back".to_string(), - description: "haha lol we have pwned your DAO".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }, - }, - &[], - ) - .unwrap(); - - // Oh no the DAO is under attack! Quick! Pause the DAO while we - // figure out what to do! - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), + cw721 + .execute( + &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { + contract: gov.address().unwrap().to_string(), + token_id: "ekez".to_string(), + msg: to_json_binary("").unwrap(), }, - &[], + None, ) - .unwrap_err() - .downcast() .unwrap(); - // Only the DAO may call this on itself. Proposal modules must use - // the execute hook. - assert_eq!(err, ContractError::Unauthorized {}); - - app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap(); - - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!( - paused, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); assert_eq!( - all_state.pause_info, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - - // This should actually be allowed to enable the admin to execute - let result = app.execute_contract( - core_addr.clone(), - core_addr.clone(), - &ExecuteMsg::UpdateConfig { - config: Config { - dao_uri: None, - name: "The Empire Strikes Back Again".to_string(), - description: "haha lol we have pwned your DAO again".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }, - }, - &[], + gov.cw_721_token_list(None, None).unwrap(), + vec![cw721.address().unwrap().clone()] ); - assert!(result.is_ok()); - - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Paused { .. })); - - app.update_block(|block| block.height += 9); - - // Still not unpaused. - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], + // Try to add an invalid cw721. + let err = gov + .update_cw_721_list( + vec![ + mock.addr_make("new").to_string(), + cw721.address().unwrap().clone().to_string(), + ], + vec![cw721.address().unwrap().clone().to_string()], ) - .unwrap_err() - .downcast() - .unwrap(); + .unwrap_err(); - assert!(matches!(err, ContractError::Paused { .. })); + // TODO + // assert!(matches!(err, ContractError::Std(_))); - app.update_block(|block| block.height += 1); + // Test that non-DAO can not update the list. + let err = gov + .call_as(&mock.addr_make("ekez")) + .update_cw_721_list(vec![], vec![cw721.address().unwrap().clone().to_string()]) + .unwrap_err(); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + assert_contains(err, ContractError::Unauthorized {}); - // Now its unpaused so we should be able to pause again. - app.execute_contract( - proposal_module.address, - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], + // Add a real cw721. + gov.update_cw_721_list( + vec![ + cw721.address().unwrap().to_string(), + another_cw721.address().unwrap().to_string(), + ], + vec![cw721.address().unwrap().to_string()], ) .unwrap(); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); assert_eq!( - paused, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 20) - } - ); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) - .unwrap(); - assert_eq!( - all_state.pause_info, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 20) - } + gov.cw_721_token_list(None, None).unwrap(), + vec![another_cw721.address().unwrap()] ); } +// #[test] +// fn test_cw721_receive_no_auto_add() { +// let (gov, proposal, mock, _) = do_standard_instantiate(false, None); + +// let cw721_id = app.store_code(cw721_contract()); + +// let cw721_addr = app +// .instantiate_contract( +// cw721_id, +// Addr::unchecked(mock.sender()), +// &cw721_base::msg::InstantiateMsg { +// name: "ekez".to_string(), +// symbol: "ekez".to_string(), +// minter: mock.sender().to_string(), +// }, +// &[], +// "cw721", +// None, +// ) +// .unwrap(); + +// let another_cw721 = app +// .instantiate_contract( +// cw721_id, +// Addr::unchecked(mock.sender()), +// &cw721_base::msg::InstantiateMsg { +// name: "ekez".to_string(), +// symbol: "ekez".to_string(), +// minter: mock.sender().to_string(), +// }, +// &[], +// "cw721", +// None, +// ) +// .unwrap(); + +// app.execute_contract( +// Addr::unchecked(mock.sender()), +// cw721_addr.clone(), +// &cw721_base::msg::ExecuteMsg::, Empty>::Mint { +// token_id: "ekez".to_string(), +// owner: mock.sender().to_string(), +// token_uri: None, +// extension: None, +// }, +// &[], +// ) +// .unwrap(); + +// app.execute_contract( +// Addr::unchecked(mock.sender()), +// cw721_addr.clone(), +// &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { +// contract: gov_addr.to_string(), +// token_id: "ekez".to_string(), +// msg: to_json_binary("").unwrap(), +// }, +// &[], +// ) +// .unwrap(); + +// let cw721_list: Vec = app +// .wrap() +// .query_wasm_smart( +// gov_addr.clone(), +// &QueryMsg::Cw721TokenList { +// start_after: None, +// limit: None, +// }, +// ) +// .unwrap(); +// assert_eq!(cw721_list, Vec::::new()); + +// // Duplicates OK. Just adds one. +// app.execute_contract( +// Addr::unchecked(gov_addr.clone()), +// gov_addr.clone(), +// &ExecuteMsg::UpdateCw721List { +// to_add: vec![ +// another_cw721.to_string(), +// cw721_addr.to_string(), +// cw721_addr.to_string(), +// ], +// to_remove: vec![], +// }, +// &[], +// ) +// .unwrap(); + +// let cw20_list: Vec = app +// .wrap() +// .query_wasm_smart( +// gov_addr, +// &QueryMsg::Cw721TokenList { +// start_after: None, +// limit: None, +// }, +// ) +// .unwrap(); +// assert_eq!(cw20_list, vec![another_cw721, cw721_addr]); +// } + +// #[test] +// fn test_pause() { +// let (gov, proposal, mock, _) = do_standard_instantiate(false, None); + +// let start_height = app.block_info().height; + +// let proposal_modules: Vec = app +// .wrap() +// .query_wasm_smart( +// core_addr.clone(), +// &QueryMsg::ProposalModules { +// start_after: None, +// limit: None, +// }, +// ) +// .unwrap(); + +// assert_eq!(proposal_modules.len(), 1); +// let proposal_module = proposal_modules.into_iter().next().unwrap(); + +// let paused: PauseInfoResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) +// .unwrap(); +// assert_eq!(paused, PauseInfoResponse::Unpaused {}); +// let all_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) +// .unwrap(); +// assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + +// // DAO is not paused. Check that we can execute things. +// // +// // Tests intentionally use the core address to send these +// // messsages to simulate a worst case scenerio where the core +// // contract has a vulnerability. +// app.execute_contract( +// core_addr.clone(), +// core_addr.clone(), +// &ExecuteMsg::UpdateConfig { +// config: Config { +// dao_uri: None, +// name: "The Empire Strikes Back".to_string(), +// description: "haha lol we have pwned your DAO".to_string(), +// image_url: None, +// automatically_add_cw20s: true, +// automatically_add_cw721s: true, +// }, +// }, +// &[], +// ) +// .unwrap(); + +// // Oh no the DAO is under attack! Quick! Pause the DAO while we +// // figure out what to do! +// let err: ContractError = app +// .execute_contract( +// proposal_module.address.clone(), +// core_addr.clone(), +// &ExecuteMsg::Pause { +// duration: Duration::Height(10), +// }, +// &[], +// ) +// .unwrap_err() +// .downcast() +// .unwrap(); + +// // Only the DAO may call this on itself. Proposal modules must use +// // the execute hook. +// assert_eq!(err, ContractError::Unauthorized {}); + +// app.execute_contract( +// proposal_module.address.clone(), +// core_addr.clone(), +// &ExecuteMsg::ExecuteProposalHook { +// msgs: vec![WasmMsg::Execute { +// contract_addr: core_addr.to_string(), +// msg: to_json_binary(&ExecuteMsg::Pause { +// duration: Duration::Height(10), +// }) +// .unwrap(), +// funds: vec![], +// } +// .into()], +// }, +// &[], +// ) +// .unwrap(); + +// let paused: PauseInfoResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) +// .unwrap(); +// assert_eq!( +// paused, +// PauseInfoResponse::Paused { +// expiration: Expiration::AtHeight(start_height + 10) +// } +// ); +// let all_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) +// .unwrap(); +// assert_eq!( +// all_state.pause_info, +// PauseInfoResponse::Paused { +// expiration: Expiration::AtHeight(start_height + 10) +// } +// ); + +// // This should actually be allowed to enable the admin to execute +// let result = app.execute_contract( +// core_addr.clone(), +// core_addr.clone(), +// &ExecuteMsg::UpdateConfig { +// config: Config { +// dao_uri: None, +// name: "The Empire Strikes Back Again".to_string(), +// description: "haha lol we have pwned your DAO again".to_string(), +// image_url: None, +// automatically_add_cw20s: true, +// automatically_add_cw721s: true, +// }, +// }, +// &[], +// ); +// assert!(result.is_ok()); + +// let err: ContractError = app +// .execute_contract( +// proposal_module.address.clone(), +// core_addr.clone(), +// &ExecuteMsg::ExecuteProposalHook { +// msgs: vec![WasmMsg::Execute { +// contract_addr: core_addr.to_string(), +// msg: to_json_binary(&ExecuteMsg::Pause { +// duration: Duration::Height(10), +// }) +// .unwrap(), +// funds: vec![], +// } +// .into()], +// }, +// &[], +// ) +// .unwrap_err() +// .downcast() +// .unwrap(); + +// assert!(matches!(err, ContractError::Paused { .. })); + +// app.update_block(|block| block.height += 9); + +// // Still not unpaused. +// let err: ContractError = app +// .execute_contract( +// proposal_module.address.clone(), +// core_addr.clone(), +// &ExecuteMsg::ExecuteProposalHook { +// msgs: vec![WasmMsg::Execute { +// contract_addr: core_addr.to_string(), +// msg: to_json_binary(&ExecuteMsg::Pause { +// duration: Duration::Height(10), +// }) +// .unwrap(), +// funds: vec![], +// } +// .into()], +// }, +// &[], +// ) +// .unwrap_err() +// .downcast() +// .unwrap(); + +// assert!(matches!(err, ContractError::Paused { .. })); + +// app.update_block(|block| block.height += 1); + +// let paused: PauseInfoResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) +// .unwrap(); +// assert_eq!(paused, PauseInfoResponse::Unpaused {}); +// let all_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) +// .unwrap(); +// assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + +// // Now its unpaused so we should be able to pause again. +// app.execute_contract( +// proposal_module.address, +// core_addr.clone(), +// &ExecuteMsg::ExecuteProposalHook { +// msgs: vec![WasmMsg::Execute { +// contract_addr: core_addr.to_string(), +// msg: to_json_binary(&ExecuteMsg::Pause { +// duration: Duration::Height(10), +// }) +// .unwrap(), +// funds: vec![], +// } +// .into()], +// }, +// &[], +// ) +// .unwrap(); + +// let paused: PauseInfoResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) +// .unwrap(); +// assert_eq!( +// paused, +// PauseInfoResponse::Paused { +// expiration: Expiration::AtHeight(start_height + 20) +// } +// ); +// let all_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) +// .unwrap(); +// assert_eq!( +// all_state.pause_info, +// PauseInfoResponse::Paused { +// expiration: Expiration::AtHeight(start_height + 20) +// } +// ); +// } + #[test] fn test_dump_state_proposal_modules() { - let (core_addr, app) = do_standard_instantiate(false, None); - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let (gov, proposal, mock, _) = do_standard_instantiate(false, false); + let proposal_modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(proposal_modules.len(), 1); let proposal_module = proposal_modules.into_iter().next().unwrap(); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) - .unwrap(); + let all_state: DumpStateResponse = gov.dump_state().unwrap(); assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); assert_eq!(all_state.proposal_modules.len(), 1); assert_eq!(all_state.proposal_modules[0], proposal_module); } -// Note that this isn't actually testing that we are migrating from the previous version since -// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, -// this just tests the idempotency of migrate. -#[test] -fn test_migrate_from_compatible() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - // Instantiate the core module with an admin to do migrations. - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - let core_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - Some(CREATOR_ADDR.to_string()), - ) - .unwrap(); - - let state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - - app.execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: gov_id, - msg: to_json_binary(&MigrateMsg::FromCompatible {}).unwrap(), - }), - ) - .unwrap(); - - let new_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) - .unwrap(); - - assert_eq!(new_state, state); -} - -#[test] -fn test_migrate_from_beta() { - use cw_core_v1 as v1; - - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let core_id = app.store_code(cw_core_contract()); - let v1_core_id = app.store_code(v1_cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); - - let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - // Instantiate the core module with an admin to do migrations. - let v1_core_instantiate = v1::msg::InstantiateMsg { - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { - code_id: voting_id, - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ - v1::msg::ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&proposal_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "governance module 1".to_string(), - }, - v1::msg::ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&proposal_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "governance module 2".to_string(), - }, - ], - initial_items: None, - }; - - let core_addr = app - .instantiate_contract( - v1_core_id, - Addr::unchecked(CREATOR_ADDR), - &v1_core_instantiate, - &[], - "cw-governance", - Some(CREATOR_ADDR.to_string()), - ) - .unwrap(); - - app.execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: core_id, - msg: to_json_binary(&MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }) - .unwrap(), - }), - ) - .unwrap(); - - let new_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(&core_addr, &QueryMsg::DumpState {}) - .unwrap(); - - let proposal_modules = new_state.proposal_modules; - assert_eq!(2, proposal_modules.len()); - for (idx, module) in proposal_modules.iter().enumerate() { - let prefix = derive_proposal_module_prefix(idx).unwrap(); - assert_eq!(prefix, module.prefix); - assert_eq!(ProposalModuleStatus::Enabled, module.status); - } - - // Check that we may not migrate more than once. - let err: ContractError = app - .execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: core_id, - msg: to_json_binary(&MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }) - .unwrap(), - }), - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::AlreadyMigrated {}) -} - -#[test] -fn test_migrate_mock() { - let mut deps = mock_dependencies(); - let dao_uri: String = "/dao/uri".to_string(); - let msg = MigrateMsg::FromV1 { - dao_uri: Some(dao_uri.clone()), - params: None, - }; - let env = mock_env(); - - // Set starting version to v1. - set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); - - // Write to storage in old proposal module format - let proposal_modules_key = Addr::unchecked("addr"); - let old_map: Map = Map::new("proposal_modules"); - let path = old_map.key(proposal_modules_key.clone()); - deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); - - // Write to storage in old config format - #[cw_serde] - struct V1Config { - pub name: String, - pub description: String, - pub image_url: Option, - pub automatically_add_cw20s: bool, - pub automatically_add_cw721s: bool, - } - - let v1_config = V1Config { - name: "core dao".to_string(), - description: "a dao".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - }; - - let config_item: Item = Item::new("config"); - config_item.save(&mut deps.storage, &v1_config).unwrap(); - - // Migrate to v2 - migrate(deps.as_mut(), env, msg).unwrap(); - - let new_path = PROPOSAL_MODULES.key(proposal_modules_key); - let prop_module_bytes = deps.storage.get(&new_path).unwrap(); - let module: ProposalModule = from_json(prop_module_bytes).unwrap(); - assert_eq!(module.address, Addr::unchecked("addr")); - assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); - assert_eq!(module.status, ProposalModuleStatus::Enabled {}); - - let v2_config_item: Item = Item::new("config_v2"); - let v2_config = v2_config_item.load(&deps.storage).unwrap(); - assert_eq!(v2_config.dao_uri, Some(dao_uri)); - assert_eq!(v2_config.name, v1_config.name); - assert_eq!(v2_config.description, v1_config.description); - assert_eq!(v2_config.image_url, v1_config.image_url); - assert_eq!( - v2_config.automatically_add_cw20s, - v1_config.automatically_add_cw20s - ); - assert_eq!( - v2_config.automatically_add_cw721s, - v1_config.automatically_add_cw721s - ) -} - -#[test] -fn test_execute_stargate_msg() { - let (core_addr, mut app) = do_standard_instantiate(true, None); - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); - - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - - let res = app.execute_contract( - proposal_module.address, - core_addr, - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![CosmosMsg::Stargate { - type_url: "foo_type".to_string(), - value: to_json_binary("foo_bin").unwrap(), - }], - }, - &[], - ); - // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert - assert!(res.is_err()); -} - -#[test] -fn test_module_prefixes() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 1".to_string(), - }, - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 2".to_string(), - }, - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 2".to_string(), - }, - ], - initial_items: None, - }; - - let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); - - let modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(modules.len(), 3); - - let module_1 = &modules[0]; - assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_1.prefix, "A"); - assert_eq!(&module_1.address, &modules[0].address); - - let module_2 = &modules[1]; - assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_2.prefix, "B"); - assert_eq!(&module_2.address, &modules[1].address); - - let module_3 = &modules[2]; - assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_3.prefix, "C"); - assert_eq!(&module_3.address, &modules[2].address); -} +// // Note that this isn't actually testing that we are migrating from the previous version since +// // with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, +// // this just tests the idempotency of migrate. +// #[test] +// fn test_migrate_from_compatible() { +// let mut app = App::default(); +// let govmod_id = app.store_code(sudo_proposal_contract()); +// let voting_id = app.store_code(cw20_balances_voting()); +// let gov_id = app.store_code(cw_core_contract()); +// let cw20_id = app.store_code(cw20_contract()); + +// let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { +// root: mock.sender().to_string(), +// }; +// let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { +// token_info: dao_voting_cw20_balance::msg::TokenInfo::New { +// code_id: cw20_id, +// label: "DAO DAO voting".to_string(), +// name: "DAO DAO".to_string(), +// symbol: "DAO".to_string(), +// decimals: 6, +// initial_balances: vec![cw20::Cw20Coin { +// address: mock.sender().to_string(), +// amount: Uint128::from(2u64), +// }], +// marketing: None, +// }, +// }; + +// // Instantiate the core module with an admin to do migrations. +// let gov_instantiate = InstantiateMsg { +// dao_uri: None, +// admin: None, +// name: "DAO DAO".to_string(), +// description: "A DAO that builds DAOs.".to_string(), +// image_url: None, +// automatically_add_cw20s: false, +// automatically_add_cw721s: false, +// voting_module_instantiate_info: ModuleInstantiateInfo { +// code_id: voting_id, +// msg: to_json_binary(&voting_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "voting module".to_string(), +// }, +// proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&govmod_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "governance module".to_string(), +// }], +// initial_items: None, +// }; + +// let core_addr = app +// .instantiate_contract( +// gov_id, +// Addr::unchecked(mock.sender()), +// &gov_instantiate, +// &[], +// "cw-governance", +// Some(mock.sender().to_string()), +// ) +// .unwrap(); + +// let state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) +// .unwrap(); + +// app.execute( +// Addr::unchecked(mock.sender()), +// CosmosMsg::Wasm(WasmMsg::Migrate { +// contract_addr: core_addr.to_string(), +// new_code_id: gov_id, +// msg: to_json_binary(&MigrateMsg::FromCompatible {}).unwrap(), +// }), +// ) +// .unwrap(); + +// let new_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) +// .unwrap(); + +// assert_eq!(new_state, state); +// } + +// #[test] +// fn test_migrate_from_beta() { +// use cw_core_v1 as v1; + +// let mut app = App::default(); +// let govmod_id = app.store_code(sudo_proposal_contract()); +// let voting_id = app.store_code(cw20_balances_voting()); +// let core_id = app.store_code(cw_core_contract()); +// let v1_core_id = app.store_code(v1_cw_core_contract()); +// let cw20_id = app.store_code(cw20_contract()); + +// let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { +// root: mock.sender().to_string(), +// }; +// let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { +// token_info: dao_voting_cw20_balance::msg::TokenInfo::New { +// code_id: cw20_id, +// label: "DAO DAO voting".to_string(), +// name: "DAO DAO".to_string(), +// symbol: "DAO".to_string(), +// decimals: 6, +// initial_balances: vec![cw20::Cw20Coin { +// address: mock.sender().to_string(), +// amount: Uint128::from(2u64), +// }], +// marketing: None, +// }, +// }; + +// // Instantiate the core module with an admin to do migrations. +// let v1_core_instantiate = v1::msg::InstantiateMsg { +// admin: None, +// name: "DAO DAO".to_string(), +// description: "A DAO that builds DAOs.".to_string(), +// image_url: None, +// automatically_add_cw20s: false, +// automatically_add_cw721s: false, +// voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { +// code_id: voting_id, +// msg: to_json_binary(&voting_instantiate).unwrap(), +// admin: v1::msg::Admin::CoreContract {}, +// label: "voting module".to_string(), +// }, +// proposal_modules_instantiate_info: vec![ +// v1::msg::ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&proposal_instantiate).unwrap(), +// admin: v1::msg::Admin::CoreContract {}, +// label: "governance module 1".to_string(), +// }, +// v1::msg::ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&proposal_instantiate).unwrap(), +// admin: v1::msg::Admin::CoreContract {}, +// label: "governance module 2".to_string(), +// }, +// ], +// initial_items: None, +// }; + +// let core_addr = app +// .instantiate_contract( +// v1_core_id, +// Addr::unchecked(mock.sender()), +// &v1_core_instantiate, +// &[], +// "cw-governance", +// Some(mock.sender().to_string()), +// ) +// .unwrap(); + +// app.execute( +// Addr::unchecked(mock.sender()), +// CosmosMsg::Wasm(WasmMsg::Migrate { +// contract_addr: core_addr.to_string(), +// new_code_id: core_id, +// msg: to_json_binary(&MigrateMsg::FromV1 { +// dao_uri: None, +// params: None, +// }) +// .unwrap(), +// }), +// ) +// .unwrap(); + +// let new_state: DumpStateResponse = app +// .wrap() +// .query_wasm_smart(&core_addr, &QueryMsg::DumpState {}) +// .unwrap(); + +// let proposal_modules = new_state.proposal_modules; +// assert_eq!(2, proposal_modules.len()); +// for (idx, module) in proposal_modules.iter().enumerate() { +// let prefix = derive_proposal_module_prefix(idx).unwrap(); +// assert_eq!(prefix, module.prefix); +// assert_eq!(ProposalModuleStatus::Enabled, module.status); +// } + +// // Check that we may not migrate more than once. +// let err: ContractError = app +// .execute( +// Addr::unchecked(mock.sender()), +// CosmosMsg::Wasm(WasmMsg::Migrate { +// contract_addr: core_addr.to_string(), +// new_code_id: core_id, +// msg: to_json_binary(&MigrateMsg::FromV1 { +// dao_uri: None, +// params: None, +// }) +// .unwrap(), +// }), +// ) +// .unwrap_err() +// .downcast() +// .unwrap(); +// assert_eq!(err, ContractError::AlreadyMigrated {}) +// } + +// #[test] +// fn test_migrate_mock() { +// let mut deps = mock_dependencies(); +// let dao_uri: String = "/dao/uri".to_string(); +// let msg = MigrateMsg::FromV1 { +// dao_uri: Some(dao_uri.clone()), +// params: None, +// }; +// let env = mock_env(); + +// // Set starting version to v1. +// set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); + +// // Write to storage in old proposal module format +// let proposal_modules_key = Addr::unchecked("addr"); +// let old_map: Map = Map::new("proposal_modules"); +// let path = old_map.key(proposal_modules_key.clone()); +// deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); + +// // Write to storage in old config format +// #[cw_serde] +// struct V1Config { +// pub name: String, +// pub description: String, +// pub image_url: Option, +// pub automatically_add_cw20s: bool, +// pub automatically_add_cw721s: bool, +// } + +// let v1_config = V1Config { +// name: "core dao".to_string(), +// description: "a dao".to_string(), +// image_url: None, +// automatically_add_cw20s: false, +// automatically_add_cw721s: false, +// }; + +// let config_item: Item = Item::new("config"); +// config_item.save(&mut deps.storage, &v1_config).unwrap(); + +// // Migrate to v2 +// migrate(deps.as_mut(), env, msg).unwrap(); + +// let new_path = PROPOSAL_MODULES.key(proposal_modules_key); +// let prop_module_bytes = deps.storage.get(&new_path).unwrap(); +// let module: ProposalModule = from_json(prop_module_bytes).unwrap(); +// assert_eq!(module.address, Addr::unchecked("addr")); +// assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); +// assert_eq!(module.status, ProposalModuleStatus::Enabled {}); + +// let v2_config_item: Item = Item::new("config_v2"); +// let v2_config = v2_config_item.load(&deps.storage).unwrap(); +// assert_eq!(v2_config.dao_uri, Some(dao_uri)); +// assert_eq!(v2_config.name, v1_config.name); +// assert_eq!(v2_config.description, v1_config.description); +// assert_eq!(v2_config.image_url, v1_config.image_url); +// assert_eq!( +// v2_config.automatically_add_cw20s, +// v1_config.automatically_add_cw20s +// ); +// assert_eq!( +// v2_config.automatically_add_cw721s, +// v1_config.automatically_add_cw721s +// ) +// } + +// #[test] +// fn test_execute_stargate_msg() { +// let (gov, proposal, mock, _) = do_standard_instantiate(true, None); +// let proposal_modules: Vec = app +// .wrap() +// .query_wasm_smart( +// core_addr.clone(), +// &QueryMsg::ProposalModules { +// start_after: None, +// limit: None, +// }, +// ) +// .unwrap(); + +// assert_eq!(proposal_modules.len(), 1); +// let proposal_module = proposal_modules.into_iter().next().unwrap(); + +// let res = app.execute_contract( +// proposal_module.address, +// core_addr, +// &ExecuteMsg::ExecuteProposalHook { +// msgs: vec![CosmosMsg::Stargate { +// type_url: "foo_type".to_string(), +// value: to_json_binary("foo_bin").unwrap(), +// }], +// }, +// &[], +// ); +// // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert +// assert!(res.is_err()); +// } + +// #[test] +// fn test_module_prefixes() { +// let mock = MockBech32::new("mock"); +// let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); +// let gov = DaoDaoCore::new("dao-core", mock.clone()); +// gov_mod.upload().unwrap(); +// let govmod_id = gov_mod.code_id().unwrap(); +// gov.upload().unwrap(); + +// let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { +// root: mock.sender().to_string(), +// }; + +// let gov_instantiate = InstantiateMsg { +// dao_uri: None, +// admin: None, +// name: "DAO DAO".to_string(), +// description: "A DAO that builds DAOs.".to_string(), +// image_url: None, +// automatically_add_cw20s: true, +// automatically_add_cw721s: true, +// voting_module_instantiate_info: ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&govmod_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "voting module".to_string(), +// }, +// proposal_modules_instantiate_info: vec![ +// ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&govmod_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "proposal module 1".to_string(), +// }, +// ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&govmod_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "proposal module 2".to_string(), +// }, +// ModuleInstantiateInfo { +// code_id: govmod_id, +// msg: to_json_binary(&govmod_instantiate).unwrap(), +// admin: Some(Admin::CoreModule {}), +// funds: vec![], +// label: "proposal module 2".to_string(), +// }, +// ], +// initial_items: None, +// }; + +// let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); + +// let modules = gov.proposal_modules(None, None).unwrap(); +// assert_eq!(modules.len(), 3); + +// let module_1 = &modules[0]; +// assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); +// assert_eq!(module_1.prefix, "A"); +// assert_eq!(&module_1.address, &modules[0].address); + +// let module_2 = &modules[1]; +// assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); +// assert_eq!(module_2.prefix, "B"); +// assert_eq!(&module_2.address, &modules[1].address); + +// let module_3 = &modules[2]; +// assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); +// assert_eq!(module_3.prefix, "C"); +// assert_eq!(&module_3.address, &modules[2].address); +// } fn get_active_modules(gov: &DaoDaoCore) -> Vec { let modules = gov.proposal_modules(None, None).unwrap(); @@ -2793,10 +2457,10 @@ fn get_active_modules(gov: &DaoDaoCore) -> Vec = vec![ SubDao { - addr: "subdao001".to_string(), + addr: mock.addr_make("subdao001").to_string(), charter: None, }, SubDao { - addr: "subdao002".to_string(), + addr: mock.addr_make("subdao002").to_string(), charter: Some("cool charter bro".to_string()), }, SubDao { - addr: "subdao005".to_string(), + addr: mock.addr_make("subdao005").to_string(), charter: None, }, SubDao { - addr: "subdao007".to_string(), + addr: mock.addr_make("subdao007").to_string(), charter: None, }, ]; let to_remove: Vec = vec![]; - app.execute_contract( - Addr::unchecked(core_addr.clone()), - core_addr.clone(), - &ExecuteMsg::UpdateSubDaos { to_add, to_remove }, - &[], - ) - .unwrap(); - - let res: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ListSubDaos { - start_after: None, - limit: None, - }, - ) - .unwrap(); + gov.update_sub_daos(to_add, to_remove).unwrap(); - assert_eq!(res.len(), 4); + assert_eq!(gov.list_sub_daos(None, None).unwrap().len(), 4); - let to_remove: Vec = vec!["subdao005".to_string()]; + let to_remove: Vec = vec![mock.addr_make("subdao005").to_string()]; - app.execute_contract( - Addr::unchecked(core_addr.clone()), - core_addr.clone(), - &ExecuteMsg::UpdateSubDaos { - to_add: vec![], - to_remove, - }, - &[], - ) - .unwrap(); + gov.update_sub_daos(vec![], to_remove).unwrap(); - let res: Vec = app - .wrap() - .query_wasm_smart( - core_addr, - &QueryMsg::ListSubDaos { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let res = gov.list_sub_daos(None, None).unwrap(); assert_eq!(res.len(), 3); - - let test_res: SubDao = SubDao { - addr: "subdao002".to_string(), - charter: Some("cool charter bro".to_string()), - }; - - assert_eq!(res[1], test_res); - let full_result_set: Vec = vec![ SubDao { - addr: "subdao001".to_string(), + addr: mock.addr_make("subdao001").to_string(), charter: None, }, SubDao { - addr: "subdao002".to_string(), + addr: mock.addr_make("subdao002").to_string(), charter: Some("cool charter bro".to_string()), }, SubDao { - addr: "subdao007".to_string(), + addr: mock.addr_make("subdao007").to_string(), charter: None, }, ]; @@ -2907,13 +2528,9 @@ pub fn test_migrate_update_version() { #[test] fn test_query_info() { - let (core_addr, app) = do_standard_instantiate(true, None); - let res: InfoResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::Info {}) - .unwrap(); + let (gov, _, _, _) = do_standard_instantiate(true, false); assert_eq!( - res, + gov.info().unwrap(), InfoResponse { info: ContractVersion { contract: CONTRACT_NAME.to_string(), diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index 8c27bfdde..5b637879e 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -8,10 +8,12 @@ version.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +cosmwasm-std.workspace = true cw-orch = { version = "0.22.2" } cw20-stake = { version = "2.4.2", path = "../../contracts/staking/cw20-stake" } cw20-stake-external-rewards = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-external-rewards" } cw20-stake-reward-distributor = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-reward-distributor" } +cw721-base.workspace = true dao-dao-core = { version = "2.4.2", path = "../../contracts/dao-dao-core" } dao-interface = { version = "2.4.2", path = "../dao-interface" } dao-pre-propose-approval-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approval-single" } @@ -30,3 +32,4 @@ dao-voting-cw4 = { version = "2.4.2", path = "../../contracts/voting/dao-voting- dao-voting-cw721-roles = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-roles" } dao-voting-cw721-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-staked" } dao-voting-token-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-token-staked" } +serde.workspace = true diff --git a/packages/cw-orch/src/test_contracts/cw721.rs b/packages/cw-orch/src/test_contracts/cw721.rs new file mode 100644 index 000000000..2bd6fc9cd --- /dev/null +++ b/packages/cw-orch/src/test_contracts/cw721.rs @@ -0,0 +1,20 @@ +use cosmwasm_std::Empty; +use cw721_base::{ + entry::{execute, instantiate, query}, + ExecuteMsg, InstantiateMsg, QueryMsg, +}; +use cw_orch::interface; +use cw_orch::prelude::*; + +pub type Cw721BaseQueryMsg = QueryMsg; +#[interface(InstantiateMsg, ExecuteMsg, Cw721BaseQueryMsg, Empty)] +pub struct Cw721BaseGeneric; + +impl Uploadable for Cw721BaseGeneric { + // Return a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} + +pub type Cw721Base = Cw721BaseGeneric, Empty>; diff --git a/packages/cw-orch/src/test_contracts/mod.rs b/packages/cw-orch/src/test_contracts/mod.rs index ac82e1634..674ad6cc6 100644 --- a/packages/cw-orch/src/test_contracts/mod.rs +++ b/packages/cw-orch/src/test_contracts/mod.rs @@ -1,8 +1,10 @@ +mod cw721; mod proposal_hook_counter; mod proposal_sudo; mod test_custom_factory; mod voting_cw20_balance; +pub use cw721::Cw721Base; pub use proposal_hook_counter::DaoProposalHookCounter; pub use proposal_sudo::DaoProposalSudo; pub use test_custom_factory::DaoTestCustomFactory; diff --git a/packages/dao-interface/src/msg.rs b/packages/dao-interface/src/msg.rs index 3e650b8ce..e8027f7c5 100644 --- a/packages/dao-interface/src/msg.rs +++ b/packages/dao-interface/src/msg.rs @@ -148,7 +148,7 @@ pub enum QueryMsg { Config {}, /// Gets the token balance for each cw20 registered with the /// contract. - #[returns(crate::query::Cw20BalanceResponse)] + #[returns(Vec)] Cw20Balances { start_after: Option, limit: Option, @@ -179,7 +179,7 @@ pub enum QueryMsg { /// example, given the items `{ "group": "foo", "subdao": "bar"}` /// this query would return `[("group", "foo"), ("subdao", /// "bar")]`. - #[returns(Vec)] + #[returns(Vec<(String, String)>)] ListItems { start_after: Option, limit: Option, From d06b3772129a4d8a1f1e10eab4929500764e4872 Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 08:06:38 +0000 Subject: [PATCH 04/50] Finalize test changes --- contracts/dao-dao-core/src/cw_orch_tests.rs | 1375 ++++++++----------- 1 file changed, 577 insertions(+), 798 deletions(-) diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs index 340a91851..66096b85c 100644 --- a/contracts/dao-dao-core/src/cw_orch_tests.rs +++ b/contracts/dao-dao-core/src/cw_orch_tests.rs @@ -1,19 +1,21 @@ use crate::{ contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, + cw_orch_tests::v1::DaoDaoCoreV1, state::PROPOSAL_MODULES, ContractError, }; use abstract_cw20::msg::Cw20ExecuteMsgFns; use abstract_cw_plus_interface::cw20_base::Cw20Base; + use cosmwasm_schema::cw_serde; use cosmwasm_std::{ from_json, testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, CosmosMsg, Empty, StdError, Storage, Uint128, WasmMsg, + to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, }; use cw2::{set_contract_version, ContractVersion}; -use cw_multi_test::{App, Contract, ContractWrapper, Executor}; use cw_orch::prelude::*; + use cw_storage_plus::{Item, Map}; use cw_utils::{Duration, Expiration}; use dao_cw_orch::Cw721Base; @@ -21,7 +23,7 @@ use dao_cw_orch::{DaoDaoCore, DaoProposalSudo, DaoVotingCw20Balance}; use dao_interface::CoreExecuteMsgFns; use dao_interface::CoreQueryMsgFns; use dao_interface::{ - msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg, QueryMsg}, + msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg}, query::{ AdminNominationResponse, Cw20BalanceResponse, DumpStateResponse, GetItemResponse, PauseInfoResponse, ProposalModuleCountResponse, SubDao, @@ -35,60 +37,31 @@ pub fn assert_contains(e: impl std::fmt::Debug, el: impl ToString) { assert!(format!("{:?}", e).contains(&el.to_string())) } -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} +pub mod v1 { + use cw_orch::{interface, prelude::*}; -fn cw721_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_base::entry::execute, - cw721_base::entry::instantiate, - cw721_base::entry::query, - ); - Box::new(contract) -} + use cw_core_v1::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -fn sudo_proposal_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_sudo::contract::execute, - dao_proposal_sudo::contract::instantiate, - dao_proposal_sudo::contract::query, - ); - Box::new(contract) -} - -fn cw20_balances_voting() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_balance::contract::execute, - dao_voting_cw20_balance::contract::instantiate, - dao_voting_cw20_balance::contract::query, - ) - .with_reply(dao_voting_cw20_balance::contract::reply); - Box::new(contract) -} + #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] + pub struct DaoDaoCoreV1; -fn cw_core_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn v1_cw_core_contract() -> Box> { - use cw_core_v1::contract; - let contract = ContractWrapper::new(contract::execute, contract::instantiate, contract::query) - .with_reply(contract::reply) - .with_migrate(contract::migrate); - Box::new(contract) + impl Uploadable for DaoDaoCoreV1 { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_dao_core") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + use cw_core_v1::contract; + Box::new( + ContractWrapper::new(contract::execute, contract::instantiate, contract::query) + .with_reply(contract::reply) + .with_migrate(contract::migrate), + ) + } + } } fn test_instantiate_with_n_gov_modules(n: usize) { @@ -959,7 +932,7 @@ fn test_admin_permissions() { .unwrap_err(); // Admin can call ExecuteAdminMsgs, here an admin pauses the DAO - let res = core_with_admin + let _res = core_with_admin .call_as(&admin) .execute_admin_msgs(vec![WasmMsg::Execute { contract_addr: core_with_admin.address().unwrap().to_string(), @@ -990,7 +963,7 @@ fn test_admin_permissions() { ); // Admin pauses DAO again - let res = core_with_admin + let _res = core_with_admin .call_as(&admin) .execute_admin_msgs(vec![WasmMsg::Execute { contract_addr: core_with_admin.address().unwrap().to_string(), @@ -1004,16 +977,16 @@ fn test_admin_permissions() { .unwrap(); // DAO with admin cannot unpause itself - let res = core_with_admin + let _res = core_with_admin .call_as(&core_with_admin.address().unwrap()) .unpause() .unwrap_err(); // Random person cannot unpause the DAO - let res = core_with_admin.call_as(&random).unpause().unwrap_err(); + let _res = core_with_admin.call_as(&random).unpause().unwrap_err(); // Admin can unpause the DAO directly - let res = core_with_admin.call_as(&admin).unpause().unwrap(); + let _res = core_with_admin.call_as(&admin).unpause().unwrap(); // Check we are unpaused @@ -1203,26 +1176,6 @@ fn test_passthrough_voting_queries() { ); } -fn set_item(app: &mut App, gov_addr: Addr, key: String, value: String) { - app.execute_contract( - gov_addr.clone(), - gov_addr, - &ExecuteMsg::SetItem { key, value }, - &[], - ) - .unwrap(); -} - -fn remove_item(app: &mut App, gov_addr: Addr, key: String) { - app.execute_contract( - gov_addr.clone(), - gov_addr, - &ExecuteMsg::RemoveItem { key }, - &[], - ) - .unwrap(); -} - #[test] fn test_item_permissions() { let (gov, _, mock, _) = do_standard_instantiate(true, false); @@ -1240,7 +1193,7 @@ fn test_item_permissions() { #[test] fn test_add_remove_get() { - let (gov, _, mock, _) = do_standard_instantiate(true, false); + let (gov, _, _mock, _) = do_standard_instantiate(true, false); let a = gov.get_item("aaaaa".to_string()).unwrap(); assert_eq!(a, GetItemResponse { item: None }); @@ -1449,7 +1402,7 @@ fn test_instantiate_with_items() { initial_items.pop(); gov_instantiate.initial_items = Some(initial_items); - let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); + let _gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); // Ensure initial items were added. let items = gov.list_items(None, None).unwrap(); @@ -1473,7 +1426,7 @@ fn test_instantiate_with_items() { #[test] fn test_cw20_receive_auto_add() { - let (gov, proposal, mock, _) = do_standard_instantiate(true, false); + let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); another_cw20.upload().unwrap(); another_cw20 @@ -1558,7 +1511,7 @@ fn test_cw20_receive_auto_add() { #[test] fn test_cw20_receive_no_auto_add() { - let (gov, proposal, mock, _) = do_standard_instantiate(false, false); + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); another_cw20.upload().unwrap(); @@ -1622,7 +1575,7 @@ fn test_cw20_receive_no_auto_add() { #[test] fn test_cw721_receive() { - let (gov, proposal, mock, _) = do_standard_instantiate(true, false); + let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); let cw721 = Cw721Base::new("cw721", mock.clone()); cw721.upload().unwrap(); @@ -1691,7 +1644,9 @@ fn test_cw721_receive() { ) .unwrap_err(); - // TODO + println!("{:?}", err); + assert_contains(&err, "key:"); + assert_contains(err, "not found"); // assert!(matches!(err, ContractError::Std(_))); // Test that non-DAO can not update the list. @@ -1718,343 +1673,210 @@ fn test_cw721_receive() { ); } -// #[test] -// fn test_cw721_receive_no_auto_add() { -// let (gov, proposal, mock, _) = do_standard_instantiate(false, None); - -// let cw721_id = app.store_code(cw721_contract()); - -// let cw721_addr = app -// .instantiate_contract( -// cw721_id, -// Addr::unchecked(mock.sender()), -// &cw721_base::msg::InstantiateMsg { -// name: "ekez".to_string(), -// symbol: "ekez".to_string(), -// minter: mock.sender().to_string(), -// }, -// &[], -// "cw721", -// None, -// ) -// .unwrap(); - -// let another_cw721 = app -// .instantiate_contract( -// cw721_id, -// Addr::unchecked(mock.sender()), -// &cw721_base::msg::InstantiateMsg { -// name: "ekez".to_string(), -// symbol: "ekez".to_string(), -// minter: mock.sender().to_string(), -// }, -// &[], -// "cw721", -// None, -// ) -// .unwrap(); - -// app.execute_contract( -// Addr::unchecked(mock.sender()), -// cw721_addr.clone(), -// &cw721_base::msg::ExecuteMsg::, Empty>::Mint { -// token_id: "ekez".to_string(), -// owner: mock.sender().to_string(), -// token_uri: None, -// extension: None, -// }, -// &[], -// ) -// .unwrap(); - -// app.execute_contract( -// Addr::unchecked(mock.sender()), -// cw721_addr.clone(), -// &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { -// contract: gov_addr.to_string(), -// token_id: "ekez".to_string(), -// msg: to_json_binary("").unwrap(), -// }, -// &[], -// ) -// .unwrap(); - -// let cw721_list: Vec = app -// .wrap() -// .query_wasm_smart( -// gov_addr.clone(), -// &QueryMsg::Cw721TokenList { -// start_after: None, -// limit: None, -// }, -// ) -// .unwrap(); -// assert_eq!(cw721_list, Vec::::new()); - -// // Duplicates OK. Just adds one. -// app.execute_contract( -// Addr::unchecked(gov_addr.clone()), -// gov_addr.clone(), -// &ExecuteMsg::UpdateCw721List { -// to_add: vec![ -// another_cw721.to_string(), -// cw721_addr.to_string(), -// cw721_addr.to_string(), -// ], -// to_remove: vec![], -// }, -// &[], -// ) -// .unwrap(); - -// let cw20_list: Vec = app -// .wrap() -// .query_wasm_smart( -// gov_addr, -// &QueryMsg::Cw721TokenList { -// start_after: None, -// limit: None, -// }, -// ) -// .unwrap(); -// assert_eq!(cw20_list, vec![another_cw721, cw721_addr]); -// } - -// #[test] -// fn test_pause() { -// let (gov, proposal, mock, _) = do_standard_instantiate(false, None); - -// let start_height = app.block_info().height; - -// let proposal_modules: Vec = app -// .wrap() -// .query_wasm_smart( -// core_addr.clone(), -// &QueryMsg::ProposalModules { -// start_after: None, -// limit: None, -// }, -// ) -// .unwrap(); - -// assert_eq!(proposal_modules.len(), 1); -// let proposal_module = proposal_modules.into_iter().next().unwrap(); - -// let paused: PauseInfoResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) -// .unwrap(); -// assert_eq!(paused, PauseInfoResponse::Unpaused {}); -// let all_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) -// .unwrap(); -// assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); - -// // DAO is not paused. Check that we can execute things. -// // -// // Tests intentionally use the core address to send these -// // messsages to simulate a worst case scenerio where the core -// // contract has a vulnerability. -// app.execute_contract( -// core_addr.clone(), -// core_addr.clone(), -// &ExecuteMsg::UpdateConfig { -// config: Config { -// dao_uri: None, -// name: "The Empire Strikes Back".to_string(), -// description: "haha lol we have pwned your DAO".to_string(), -// image_url: None, -// automatically_add_cw20s: true, -// automatically_add_cw721s: true, -// }, -// }, -// &[], -// ) -// .unwrap(); - -// // Oh no the DAO is under attack! Quick! Pause the DAO while we -// // figure out what to do! -// let err: ContractError = app -// .execute_contract( -// proposal_module.address.clone(), -// core_addr.clone(), -// &ExecuteMsg::Pause { -// duration: Duration::Height(10), -// }, -// &[], -// ) -// .unwrap_err() -// .downcast() -// .unwrap(); - -// // Only the DAO may call this on itself. Proposal modules must use -// // the execute hook. -// assert_eq!(err, ContractError::Unauthorized {}); - -// app.execute_contract( -// proposal_module.address.clone(), -// core_addr.clone(), -// &ExecuteMsg::ExecuteProposalHook { -// msgs: vec![WasmMsg::Execute { -// contract_addr: core_addr.to_string(), -// msg: to_json_binary(&ExecuteMsg::Pause { -// duration: Duration::Height(10), -// }) -// .unwrap(), -// funds: vec![], -// } -// .into()], -// }, -// &[], -// ) -// .unwrap(); - -// let paused: PauseInfoResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) -// .unwrap(); -// assert_eq!( -// paused, -// PauseInfoResponse::Paused { -// expiration: Expiration::AtHeight(start_height + 10) -// } -// ); -// let all_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) -// .unwrap(); -// assert_eq!( -// all_state.pause_info, -// PauseInfoResponse::Paused { -// expiration: Expiration::AtHeight(start_height + 10) -// } -// ); - -// // This should actually be allowed to enable the admin to execute -// let result = app.execute_contract( -// core_addr.clone(), -// core_addr.clone(), -// &ExecuteMsg::UpdateConfig { -// config: Config { -// dao_uri: None, -// name: "The Empire Strikes Back Again".to_string(), -// description: "haha lol we have pwned your DAO again".to_string(), -// image_url: None, -// automatically_add_cw20s: true, -// automatically_add_cw721s: true, -// }, -// }, -// &[], -// ); -// assert!(result.is_ok()); - -// let err: ContractError = app -// .execute_contract( -// proposal_module.address.clone(), -// core_addr.clone(), -// &ExecuteMsg::ExecuteProposalHook { -// msgs: vec![WasmMsg::Execute { -// contract_addr: core_addr.to_string(), -// msg: to_json_binary(&ExecuteMsg::Pause { -// duration: Duration::Height(10), -// }) -// .unwrap(), -// funds: vec![], -// } -// .into()], -// }, -// &[], -// ) -// .unwrap_err() -// .downcast() -// .unwrap(); - -// assert!(matches!(err, ContractError::Paused { .. })); - -// app.update_block(|block| block.height += 9); - -// // Still not unpaused. -// let err: ContractError = app -// .execute_contract( -// proposal_module.address.clone(), -// core_addr.clone(), -// &ExecuteMsg::ExecuteProposalHook { -// msgs: vec![WasmMsg::Execute { -// contract_addr: core_addr.to_string(), -// msg: to_json_binary(&ExecuteMsg::Pause { -// duration: Duration::Height(10), -// }) -// .unwrap(), -// funds: vec![], -// } -// .into()], -// }, -// &[], -// ) -// .unwrap_err() -// .downcast() -// .unwrap(); - -// assert!(matches!(err, ContractError::Paused { .. })); - -// app.update_block(|block| block.height += 1); - -// let paused: PauseInfoResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) -// .unwrap(); -// assert_eq!(paused, PauseInfoResponse::Unpaused {}); -// let all_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) -// .unwrap(); -// assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); - -// // Now its unpaused so we should be able to pause again. -// app.execute_contract( -// proposal_module.address, -// core_addr.clone(), -// &ExecuteMsg::ExecuteProposalHook { -// msgs: vec![WasmMsg::Execute { -// contract_addr: core_addr.to_string(), -// msg: to_json_binary(&ExecuteMsg::Pause { -// duration: Duration::Height(10), -// }) -// .unwrap(), -// funds: vec![], -// } -// .into()], -// }, -// &[], -// ) -// .unwrap(); - -// let paused: PauseInfoResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) -// .unwrap(); -// assert_eq!( -// paused, -// PauseInfoResponse::Paused { -// expiration: Expiration::AtHeight(start_height + 20) -// } -// ); -// let all_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) -// .unwrap(); -// assert_eq!( -// all_state.pause_info, -// PauseInfoResponse::Paused { -// expiration: Expiration::AtHeight(start_height + 20) -// } -// ); -// } +#[test] +fn test_cw721_receive_no_auto_add() { + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); + + let cw721 = Cw721Base::new("cw721", mock.clone()); + cw721.upload().unwrap(); + cw721 + .instantiate( + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: mock.sender().to_string(), + }, + None, + None, + ) + .unwrap(); + + let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); + another_cw721.set_code_id(cw721.code_id().unwrap()); + another_cw721 + .instantiate( + &cw721_base::msg::InstantiateMsg { + name: "ekez".to_string(), + symbol: "ekez".to_string(), + minter: mock.sender().to_string(), + }, + None, + None, + ) + .unwrap(); + + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + Vec::::new() + ); + + // Duplicates OK. Just adds one. + gov.update_cw_721_list( + vec![ + another_cw721.address().unwrap().to_string(), + cw721.address().unwrap().to_string(), + cw721.address().unwrap().to_string(), + ], + vec![], + ) + .unwrap(); + + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + vec![another_cw721.address().unwrap(), cw721.address().unwrap()] + ); +} + +#[test] +fn test_pause() { + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); + + let start_height = mock.block_info().unwrap().height; + + let proposal_modules = gov.proposal_modules(None, None).unwrap(); + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); + + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Unpaused {} + ); + + // DAO is not paused. Check that we can execute things. + // + // Tests intentionally use the core address to send these + // messsages to simulate a worst case scenerio where the core + // contract has a vulnerability. + gov.update_config(Config { + dao_uri: None, + name: "The Empire Strikes Back".to_string(), + description: "haha lol we have pwned your DAO".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }) + .unwrap(); + + // Oh no the DAO is under attack! Quick! Pause the DAO while we + // figure out what to do! + let err = gov + .call_as(&proposal_module.address) + .pause(Duration::Height(10)) + .unwrap_err(); + + // Only the DAO may call this on itself. Proposal modules must use + // the execute hook. + assert_contains(err, ContractError::Unauthorized {}); + gov.call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); + + assert_eq!( + gov.pause_info().unwrap(), + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 10) + } + ); + + // This should actually be allowed to enable the admin to execute + gov.update_config(Config { + dao_uri: None, + name: "The Empire Strikes Back Again".to_string(), + description: "haha lol we have pwned your DAO again".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }) + .unwrap(); + + let err = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); + + assert_contains(err, ContractError::Paused {}); + + mock.wait_blocks(9).unwrap(); + + // Still not unpaused. + + let err = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); + + assert_contains(err, ContractError::Paused {}); + + mock.wait_blocks(1).unwrap(); + + assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Unpaused {} + ); + + // Now its unpaused so we should be able to pause again. + gov.call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); + + assert_eq!( + gov.pause_info().unwrap(), + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 20) + } + ); + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Paused { + expiration: Expiration::AtHeight(start_height + 20) + } + ); +} #[test] fn test_dump_state_proposal_modules() { - let (gov, proposal, mock, _) = do_standard_instantiate(false, false); + let (gov, _proposal, _mock, _) = do_standard_instantiate(false, false); let proposal_modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(proposal_modules.len(), 1); @@ -2066,385 +1888,342 @@ fn test_dump_state_proposal_modules() { assert_eq!(all_state.proposal_modules[0], proposal_module); } -// // Note that this isn't actually testing that we are migrating from the previous version since -// // with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, -// // this just tests the idempotency of migrate. -// #[test] -// fn test_migrate_from_compatible() { -// let mut app = App::default(); -// let govmod_id = app.store_code(sudo_proposal_contract()); -// let voting_id = app.store_code(cw20_balances_voting()); -// let gov_id = app.store_code(cw_core_contract()); -// let cw20_id = app.store_code(cw20_contract()); - -// let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { -// root: mock.sender().to_string(), -// }; -// let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { -// token_info: dao_voting_cw20_balance::msg::TokenInfo::New { -// code_id: cw20_id, -// label: "DAO DAO voting".to_string(), -// name: "DAO DAO".to_string(), -// symbol: "DAO".to_string(), -// decimals: 6, -// initial_balances: vec![cw20::Cw20Coin { -// address: mock.sender().to_string(), -// amount: Uint128::from(2u64), -// }], -// marketing: None, -// }, -// }; - -// // Instantiate the core module with an admin to do migrations. -// let gov_instantiate = InstantiateMsg { -// dao_uri: None, -// admin: None, -// name: "DAO DAO".to_string(), -// description: "A DAO that builds DAOs.".to_string(), -// image_url: None, -// automatically_add_cw20s: false, -// automatically_add_cw721s: false, -// voting_module_instantiate_info: ModuleInstantiateInfo { -// code_id: voting_id, -// msg: to_json_binary(&voting_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "voting module".to_string(), -// }, -// proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&govmod_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "governance module".to_string(), -// }], -// initial_items: None, -// }; - -// let core_addr = app -// .instantiate_contract( -// gov_id, -// Addr::unchecked(mock.sender()), -// &gov_instantiate, -// &[], -// "cw-governance", -// Some(mock.sender().to_string()), -// ) -// .unwrap(); - -// let state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) -// .unwrap(); - -// app.execute( -// Addr::unchecked(mock.sender()), -// CosmosMsg::Wasm(WasmMsg::Migrate { -// contract_addr: core_addr.to_string(), -// new_code_id: gov_id, -// msg: to_json_binary(&MigrateMsg::FromCompatible {}).unwrap(), -// }), -// ) -// .unwrap(); - -// let new_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) -// .unwrap(); - -// assert_eq!(new_state, state); -// } - -// #[test] -// fn test_migrate_from_beta() { -// use cw_core_v1 as v1; - -// let mut app = App::default(); -// let govmod_id = app.store_code(sudo_proposal_contract()); -// let voting_id = app.store_code(cw20_balances_voting()); -// let core_id = app.store_code(cw_core_contract()); -// let v1_core_id = app.store_code(v1_cw_core_contract()); -// let cw20_id = app.store_code(cw20_contract()); - -// let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { -// root: mock.sender().to_string(), -// }; -// let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { -// token_info: dao_voting_cw20_balance::msg::TokenInfo::New { -// code_id: cw20_id, -// label: "DAO DAO voting".to_string(), -// name: "DAO DAO".to_string(), -// symbol: "DAO".to_string(), -// decimals: 6, -// initial_balances: vec![cw20::Cw20Coin { -// address: mock.sender().to_string(), -// amount: Uint128::from(2u64), -// }], -// marketing: None, -// }, -// }; - -// // Instantiate the core module with an admin to do migrations. -// let v1_core_instantiate = v1::msg::InstantiateMsg { -// admin: None, -// name: "DAO DAO".to_string(), -// description: "A DAO that builds DAOs.".to_string(), -// image_url: None, -// automatically_add_cw20s: false, -// automatically_add_cw721s: false, -// voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { -// code_id: voting_id, -// msg: to_json_binary(&voting_instantiate).unwrap(), -// admin: v1::msg::Admin::CoreContract {}, -// label: "voting module".to_string(), -// }, -// proposal_modules_instantiate_info: vec![ -// v1::msg::ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&proposal_instantiate).unwrap(), -// admin: v1::msg::Admin::CoreContract {}, -// label: "governance module 1".to_string(), -// }, -// v1::msg::ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&proposal_instantiate).unwrap(), -// admin: v1::msg::Admin::CoreContract {}, -// label: "governance module 2".to_string(), -// }, -// ], -// initial_items: None, -// }; - -// let core_addr = app -// .instantiate_contract( -// v1_core_id, -// Addr::unchecked(mock.sender()), -// &v1_core_instantiate, -// &[], -// "cw-governance", -// Some(mock.sender().to_string()), -// ) -// .unwrap(); - -// app.execute( -// Addr::unchecked(mock.sender()), -// CosmosMsg::Wasm(WasmMsg::Migrate { -// contract_addr: core_addr.to_string(), -// new_code_id: core_id, -// msg: to_json_binary(&MigrateMsg::FromV1 { -// dao_uri: None, -// params: None, -// }) -// .unwrap(), -// }), -// ) -// .unwrap(); - -// let new_state: DumpStateResponse = app -// .wrap() -// .query_wasm_smart(&core_addr, &QueryMsg::DumpState {}) -// .unwrap(); - -// let proposal_modules = new_state.proposal_modules; -// assert_eq!(2, proposal_modules.len()); -// for (idx, module) in proposal_modules.iter().enumerate() { -// let prefix = derive_proposal_module_prefix(idx).unwrap(); -// assert_eq!(prefix, module.prefix); -// assert_eq!(ProposalModuleStatus::Enabled, module.status); -// } - -// // Check that we may not migrate more than once. -// let err: ContractError = app -// .execute( -// Addr::unchecked(mock.sender()), -// CosmosMsg::Wasm(WasmMsg::Migrate { -// contract_addr: core_addr.to_string(), -// new_code_id: core_id, -// msg: to_json_binary(&MigrateMsg::FromV1 { -// dao_uri: None, -// params: None, -// }) -// .unwrap(), -// }), -// ) -// .unwrap_err() -// .downcast() -// .unwrap(); -// assert_eq!(err, ContractError::AlreadyMigrated {}) -// } - -// #[test] -// fn test_migrate_mock() { -// let mut deps = mock_dependencies(); -// let dao_uri: String = "/dao/uri".to_string(); -// let msg = MigrateMsg::FromV1 { -// dao_uri: Some(dao_uri.clone()), -// params: None, -// }; -// let env = mock_env(); - -// // Set starting version to v1. -// set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); - -// // Write to storage in old proposal module format -// let proposal_modules_key = Addr::unchecked("addr"); -// let old_map: Map = Map::new("proposal_modules"); -// let path = old_map.key(proposal_modules_key.clone()); -// deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); - -// // Write to storage in old config format -// #[cw_serde] -// struct V1Config { -// pub name: String, -// pub description: String, -// pub image_url: Option, -// pub automatically_add_cw20s: bool, -// pub automatically_add_cw721s: bool, -// } - -// let v1_config = V1Config { -// name: "core dao".to_string(), -// description: "a dao".to_string(), -// image_url: None, -// automatically_add_cw20s: false, -// automatically_add_cw721s: false, -// }; - -// let config_item: Item = Item::new("config"); -// config_item.save(&mut deps.storage, &v1_config).unwrap(); - -// // Migrate to v2 -// migrate(deps.as_mut(), env, msg).unwrap(); - -// let new_path = PROPOSAL_MODULES.key(proposal_modules_key); -// let prop_module_bytes = deps.storage.get(&new_path).unwrap(); -// let module: ProposalModule = from_json(prop_module_bytes).unwrap(); -// assert_eq!(module.address, Addr::unchecked("addr")); -// assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); -// assert_eq!(module.status, ProposalModuleStatus::Enabled {}); - -// let v2_config_item: Item = Item::new("config_v2"); -// let v2_config = v2_config_item.load(&deps.storage).unwrap(); -// assert_eq!(v2_config.dao_uri, Some(dao_uri)); -// assert_eq!(v2_config.name, v1_config.name); -// assert_eq!(v2_config.description, v1_config.description); -// assert_eq!(v2_config.image_url, v1_config.image_url); -// assert_eq!( -// v2_config.automatically_add_cw20s, -// v1_config.automatically_add_cw20s -// ); -// assert_eq!( -// v2_config.automatically_add_cw721s, -// v1_config.automatically_add_cw721s -// ) -// } - -// #[test] -// fn test_execute_stargate_msg() { -// let (gov, proposal, mock, _) = do_standard_instantiate(true, None); -// let proposal_modules: Vec = app -// .wrap() -// .query_wasm_smart( -// core_addr.clone(), -// &QueryMsg::ProposalModules { -// start_after: None, -// limit: None, -// }, -// ) -// .unwrap(); - -// assert_eq!(proposal_modules.len(), 1); -// let proposal_module = proposal_modules.into_iter().next().unwrap(); - -// let res = app.execute_contract( -// proposal_module.address, -// core_addr, -// &ExecuteMsg::ExecuteProposalHook { -// msgs: vec![CosmosMsg::Stargate { -// type_url: "foo_type".to_string(), -// value: to_json_binary("foo_bin").unwrap(), -// }], -// }, -// &[], -// ); -// // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert -// assert!(res.is_err()); -// } - -// #[test] -// fn test_module_prefixes() { -// let mock = MockBech32::new("mock"); -// let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); -// let gov = DaoDaoCore::new("dao-core", mock.clone()); -// gov_mod.upload().unwrap(); -// let govmod_id = gov_mod.code_id().unwrap(); -// gov.upload().unwrap(); - -// let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { -// root: mock.sender().to_string(), -// }; - -// let gov_instantiate = InstantiateMsg { -// dao_uri: None, -// admin: None, -// name: "DAO DAO".to_string(), -// description: "A DAO that builds DAOs.".to_string(), -// image_url: None, -// automatically_add_cw20s: true, -// automatically_add_cw721s: true, -// voting_module_instantiate_info: ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&govmod_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "voting module".to_string(), -// }, -// proposal_modules_instantiate_info: vec![ -// ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&govmod_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "proposal module 1".to_string(), -// }, -// ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&govmod_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "proposal module 2".to_string(), -// }, -// ModuleInstantiateInfo { -// code_id: govmod_id, -// msg: to_json_binary(&govmod_instantiate).unwrap(), -// admin: Some(Admin::CoreModule {}), -// funds: vec![], -// label: "proposal module 2".to_string(), -// }, -// ], -// initial_items: None, -// }; - -// let gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); - -// let modules = gov.proposal_modules(None, None).unwrap(); -// assert_eq!(modules.len(), 3); - -// let module_1 = &modules[0]; -// assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); -// assert_eq!(module_1.prefix, "A"); -// assert_eq!(&module_1.address, &modules[0].address); - -// let module_2 = &modules[1]; -// assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); -// assert_eq!(module_2.prefix, "B"); -// assert_eq!(&module_2.address, &modules[1].address); - -// let module_3 = &modules[2]; -// assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); -// assert_eq!(module_3.prefix, "C"); -// assert_eq!(&module_3.address, &modules[2].address); -// } +// Note that this isn't actually testing that we are migrating from the previous version since +// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, +// this just tests the idempotency of migrate. +#[test] +fn test_migrate_from_compatible() { + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20.code_id().unwrap(), + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: mock.sender().to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + // Instantiate the core module with an admin to do migrations. + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: voting.code_id().unwrap(), + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { + code_id: govmod.code_id().unwrap(), + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "governance module".to_string(), + }], + initial_items: None, + }; + + gov.instantiate(&gov_instantiate, Some(&mock.sender()), None) + .unwrap(); + + let state = gov.dump_state().unwrap(); + + gov.migrate(&MigrateMsg::FromCompatible {}, gov.code_id().unwrap()) + .unwrap(); + + let new_state = gov.dump_state().unwrap(); + + assert_eq!(new_state, state); +} + +#[test] +fn test_migrate_from_beta() { + use cw_core_v1 as v1; + + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let v1_gov = DaoDaoCoreV1::new("dao-core-v1", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + v1_gov.upload().unwrap(); + cw20.upload().unwrap(); + + let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { + token_info: dao_voting_cw20_balance::msg::TokenInfo::New { + code_id: cw20.code_id().unwrap(), + label: "DAO DAO voting".to_string(), + name: "DAO DAO".to_string(), + symbol: "DAO".to_string(), + decimals: 6, + initial_balances: vec![cw20::Cw20Coin { + address: mock.sender().to_string(), + amount: Uint128::from(2u64), + }], + marketing: None, + }, + }; + + // Instantiate the core module with an admin to do migrations. + let v1_core_instantiate = v1::msg::InstantiateMsg { + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { + code_id: voting.code_id().unwrap(), + msg: to_json_binary(&voting_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ + v1::msg::ModuleInstantiateInfo { + code_id: govmod.code_id().unwrap(), + msg: to_json_binary(&proposal_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "governance module 1".to_string(), + }, + v1::msg::ModuleInstantiateInfo { + code_id: govmod.code_id().unwrap(), + msg: to_json_binary(&proposal_instantiate).unwrap(), + admin: v1::msg::Admin::CoreContract {}, + label: "governance module 2".to_string(), + }, + ], + initial_items: None, + }; + + v1_gov + .instantiate(&v1_core_instantiate, Some(&mock.sender()), None) + .unwrap(); + + gov.set_address(&v1_gov.address().unwrap()); + gov.migrate( + &MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }, + gov.code_id().unwrap(), + ) + .unwrap(); + + let new_state = gov.dump_state().unwrap(); + + let proposal_modules = new_state.proposal_modules; + assert_eq!(2, proposal_modules.len()); + for (idx, module) in proposal_modules.iter().enumerate() { + let prefix = derive_proposal_module_prefix(idx).unwrap(); + assert_eq!(prefix, module.prefix); + assert_eq!(ProposalModuleStatus::Enabled, module.status); + } + + // Check that we may not migrate more than once. + let err = gov + .migrate( + &MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }, + gov.code_id().unwrap(), + ) + .unwrap_err(); + + assert_contains(err, ContractError::AlreadyMigrated {}) +} + +#[test] +fn test_migrate_mock() { + let mut deps = mock_dependencies(); + let dao_uri: String = "/dao/uri".to_string(); + let msg = MigrateMsg::FromV1 { + dao_uri: Some(dao_uri.clone()), + params: None, + }; + let env = mock_env(); + + // Set starting version to v1. + set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); + + // Write to storage in old proposal module format + let proposal_modules_key = Addr::unchecked("addr"); + let old_map: Map = Map::new("proposal_modules"); + let path = old_map.key(proposal_modules_key.clone()); + deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); + + // Write to storage in old config format + #[cw_serde] + struct V1Config { + pub name: String, + pub description: String, + pub image_url: Option, + pub automatically_add_cw20s: bool, + pub automatically_add_cw721s: bool, + } + + let v1_config = V1Config { + name: "core dao".to_string(), + description: "a dao".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + }; + + let config_item: Item = Item::new("config"); + config_item.save(&mut deps.storage, &v1_config).unwrap(); + + // Migrate to v2 + migrate(deps.as_mut(), env, msg).unwrap(); + + let new_path = PROPOSAL_MODULES.key(proposal_modules_key); + let prop_module_bytes = deps.storage.get(&new_path).unwrap(); + let module: ProposalModule = from_json(prop_module_bytes).unwrap(); + assert_eq!(module.address, Addr::unchecked("addr")); + assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); + assert_eq!(module.status, ProposalModuleStatus::Enabled {}); + + let v2_config_item: Item = Item::new("config_v2"); + let v2_config = v2_config_item.load(&deps.storage).unwrap(); + assert_eq!(v2_config.dao_uri, Some(dao_uri)); + assert_eq!(v2_config.name, v1_config.name); + assert_eq!(v2_config.description, v1_config.description); + assert_eq!(v2_config.image_url, v1_config.image_url); + assert_eq!( + v2_config.automatically_add_cw20s, + v1_config.automatically_add_cw20s + ); + assert_eq!( + v2_config.automatically_add_cw721s, + v1_config.automatically_add_cw721s + ) +} + +#[test] +fn test_execute_stargate_msg() { + let (gov, _proposal, _mock, _) = do_standard_instantiate(true, false); + let proposal_modules = gov.proposal_modules(None, None).unwrap(); + + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + + let res = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![CosmosMsg::Stargate { + type_url: "foo_type".to_string(), + value: to_json_binary("foo_bin").unwrap(), + }]); + + // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert + assert!(res.is_err()); +} + +#[test] +fn test_module_prefixes() { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); + + let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { + root: mock.sender().to_string(), + }; + + let gov_instantiate = InstantiateMsg { + dao_uri: None, + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + voting_module_instantiate_info: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + proposal_modules_instantiate_info: vec![ + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 1".to_string(), + }, + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 2".to_string(), + }, + ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "proposal module 2".to_string(), + }, + ], + initial_items: None, + }; + + gov.instantiate(&gov_instantiate, None, None).unwrap(); + + let modules = gov.proposal_modules(None, None).unwrap(); + assert_eq!(modules.len(), 3); + + let module_1 = &modules[0]; + assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_1.prefix, "A"); + assert_eq!(&module_1.address, &modules[0].address); + + let module_2 = &modules[1]; + assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_2.prefix, "C"); + assert_eq!(&module_2.address, &modules[1].address); + + let module_3 = &modules[2]; + assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); + assert_eq!(module_3.prefix, "B"); + assert_eq!(&module_3.address, &modules[2].address); +} fn get_active_modules(gov: &DaoDaoCore) -> Vec { let modules = gov.proposal_modules(None, None).unwrap(); From 7999ce878eaa16429bba4d1bd344fad1fb770d00 Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 08:52:54 +0000 Subject: [PATCH 05/50] Added Queryfns on voting --- Cargo.lock | 1 + contracts/dao-dao-core/src/cw_orch_tests.rs | 14 ++++---------- contracts/test/dao-voting-cw20-balance/Cargo.toml | 1 + contracts/test/dao-voting-cw20-balance/src/msg.rs | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a7a7648d..d563d2fe9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2785,6 +2785,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs index 66096b85c..aab42583e 100644 --- a/contracts/dao-dao-core/src/cw_orch_tests.rs +++ b/contracts/dao-dao-core/src/cw_orch_tests.rs @@ -32,6 +32,7 @@ use dao_interface::{ voting::{InfoResponse, VotingPowerAtHeightResponse}, }; use dao_proposal_sudo::msg::ExecuteMsgFns as _; +use dao_voting_cw20_balance::msg::QueryMsgFns; pub fn assert_contains(e: impl std::fmt::Debug, el: impl ToString) { assert!(format!("{:?}", e).contains(&el.to_string())) @@ -1448,11 +1449,8 @@ fn test_cw20_receive_auto_add() { voting.set_address(&gov.voting_module().unwrap()); let gov_token = Cw20Base::new("cw20", mock.clone()); - gov_token.set_address( - &voting - .query(&dao_voting_cw20_balance::msg::QueryMsg::TokenContract {}) - .unwrap(), - ); + + gov_token.set_address(&voting.token_contract().unwrap()); // Check that the balances query works with no tokens. let cw20_balances = gov.cw_20_balances(None, None).unwrap(); assert_eq!(cw20_balances, vec![]); @@ -1534,11 +1532,7 @@ fn test_cw20_receive_no_auto_add() { voting.set_address(&gov.voting_module().unwrap()); let gov_token = Cw20Base::new("cw20", mock.clone()); - gov_token.set_address( - &voting - .query(&dao_voting_cw20_balance::msg::QueryMsg::TokenContract {}) - .unwrap(), - ); + gov_token.set_address(&voting.token_contract().unwrap()); // Send a gov token to the governance contract. Should not be // added becasue auto add is turned off. diff --git a/contracts/test/dao-voting-cw20-balance/Cargo.toml b/contracts/test/dao-voting-cw20-balance/Cargo.toml index f126b6840..77e55bf88 100644 --- a/contracts/test/dao-voting-cw20-balance/Cargo.toml +++ b/contracts/test/dao-voting-cw20-balance/Cargo.toml @@ -27,6 +27,7 @@ thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } cw20-base = { workspace = true, features = ["library"] } +cw-orch = "0.22.2" [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/test/dao-voting-cw20-balance/src/msg.rs b/contracts/test/dao-voting-cw20-balance/src/msg.rs index c41590ee2..43002a7ba 100644 --- a/contracts/test/dao-voting-cw20-balance/src/msg.rs +++ b/contracts/test/dao-voting-cw20-balance/src/msg.rs @@ -33,5 +33,5 @@ pub enum ExecuteMsg {} #[cw20_token_query] #[voting_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg {} From 302b1aa1b582949bc76fc5485077af60e1bc704a Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 08:54:07 +0000 Subject: [PATCH 06/50] Fix tests --- contracts/dao-dao-core/src/cw_orch_tests.rs | 2314 ---------------- contracts/dao-dao-core/src/lib.rs | 2 - contracts/dao-dao-core/src/tests.rs | 2715 +++++++------------ 3 files changed, 915 insertions(+), 4116 deletions(-) delete mode 100644 contracts/dao-dao-core/src/cw_orch_tests.rs diff --git a/contracts/dao-dao-core/src/cw_orch_tests.rs b/contracts/dao-dao-core/src/cw_orch_tests.rs deleted file mode 100644 index aab42583e..000000000 --- a/contracts/dao-dao-core/src/cw_orch_tests.rs +++ /dev/null @@ -1,2314 +0,0 @@ -use crate::{ - contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, - cw_orch_tests::v1::DaoDaoCoreV1, - state::PROPOSAL_MODULES, - ContractError, -}; -use abstract_cw20::msg::Cw20ExecuteMsgFns; -use abstract_cw_plus_interface::cw20_base::Cw20Base; - -use cosmwasm_schema::cw_serde; -use cosmwasm_std::{ - from_json, - testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, -}; -use cw2::{set_contract_version, ContractVersion}; -use cw_orch::prelude::*; - -use cw_storage_plus::{Item, Map}; -use cw_utils::{Duration, Expiration}; -use dao_cw_orch::Cw721Base; -use dao_cw_orch::{DaoDaoCore, DaoProposalSudo, DaoVotingCw20Balance}; -use dao_interface::CoreExecuteMsgFns; -use dao_interface::CoreQueryMsgFns; -use dao_interface::{ - msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg}, - query::{ - AdminNominationResponse, Cw20BalanceResponse, DumpStateResponse, GetItemResponse, - PauseInfoResponse, ProposalModuleCountResponse, SubDao, - }, - state::{Admin, Config, ModuleInstantiateInfo, ProposalModule, ProposalModuleStatus}, - voting::{InfoResponse, VotingPowerAtHeightResponse}, -}; -use dao_proposal_sudo::msg::ExecuteMsgFns as _; -use dao_voting_cw20_balance::msg::QueryMsgFns; - -pub fn assert_contains(e: impl std::fmt::Debug, el: impl ToString) { - assert!(format!("{:?}", e).contains(&el.to_string())) -} - -pub mod v1 { - use cw_orch::{interface, prelude::*}; - - use cw_core_v1::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; - - #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] - pub struct DaoDaoCoreV1; - - impl Uploadable for DaoDaoCoreV1 { - /// Return the path to the wasm file corresponding to the contract - fn wasm(_chain: &ChainInfoOwned) -> WasmPath { - artifacts_dir_from_workspace!() - .find_wasm_path("dao_dao_core") - .unwrap() - } - /// Returns a CosmWasm contract wrapper - fn wrapper() -> Box> { - use cw_core_v1::contract; - Box::new( - ContractWrapper::new(contract::execute, contract::instantiate, contract::query) - .with_reply(contract::reply) - .with_migrate(contract::migrate), - ) - } - } -} - -fn test_instantiate_with_n_gov_modules(n: usize) { - let mock = MockBech32::new("mock"); - let cw20 = Cw20Base::new("cw20", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - cw20.upload().unwrap(); - let cw20_id = cw20.code_id().unwrap(); - gov.upload().unwrap(); - - let cw20_instantiate = cw20_base::msg::InstantiateMsg { - name: "DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![], - mint: None, - marketing: None, - }; - let instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary(&cw20_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: (0..n) - .map(|n| ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary(&cw20_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: format!("governance module {n}"), - }) - .collect(), - initial_items: None, - }; - gov.instantiate(&instantiate, None, None).unwrap(); - - let state = gov.dump_state().unwrap(); - - assert_eq!( - state.config, - Config { - dao_uri: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - } - ); - - assert_eq!(state.proposal_modules.len(), n); - - assert_eq!(state.active_proposal_module_count, n as u32); - assert_eq!(state.total_proposal_module_count, n as u32); -} - -#[test] -#[should_panic(expected = "Execution would result in no proposal modules being active.")] -fn test_instantiate_with_zero_gov_modules() { - test_instantiate_with_n_gov_modules(0) -} - -#[test] -fn test_valid_instantiate() { - let module_counts = [1, 2, 200]; - for count in module_counts { - test_instantiate_with_n_gov_modules(count) - } -} - -#[test] -#[should_panic( - expected = "Error parsing into type abstract_cw20_base::msg::InstantiateMsg: Invalid type" -)] -fn test_instantiate_with_submessage_failure() { - let mock = MockBech32::new("mock"); - let cw20 = Cw20Base::new("cw20", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - cw20.upload().unwrap(); - let cw20_id = cw20.code_id().unwrap(); - gov.upload().unwrap(); - - let cw20_instantiate = cw20_base::msg::InstantiateMsg { - name: "DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![], - mint: None, - marketing: None, - }; - - let mut governance_modules = (0..3) - .map(|n| ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary(&cw20_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: format!("governance module {n}"), - }) - .collect::>(); - governance_modules.push(ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary("bad").unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "I have a bad instantiate message".to_string(), - }); - governance_modules.push(ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary(&cw20_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "Everybody knowing -that goodness is good -makes wickedness." - .to_string(), - }); - - let instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: cw20_id, - msg: to_json_binary(&cw20_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: governance_modules, - initial_items: None, - }; - - gov.instantiate(&instantiate, None, None).unwrap(); -} - -#[test] -fn test_update_config() -> cw_orch::anyhow::Result<()> { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload()?; - let govmod_id = gov_mod.code_id()?; - gov.upload()?; - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate)?, - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate)?, - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None)?; - - let modules = gov.proposal_modules(None, None)?; - assert_eq!(modules.len(), 1); - gov_mod.set_address(&modules[0].clone().address); - - let expected_config = Config { - name: "Root DAO".to_string(), - description: "We love trees and sudo.".to_string(), - image_url: Some("https://moonphase.is/image.svg".to_string()), - automatically_add_cw20s: false, - automatically_add_cw721s: true, - dao_uri: Some("https://daostar.one/EIP".to_string()), - }; - - gov_mod.proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address()?.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateConfig { - config: expected_config.clone(), - })?, - } - .into()])?; - - assert_eq!(expected_config, gov.config()?); - - assert_eq!(gov.dao_uri()?.dao_uri, expected_config.dao_uri); - Ok(()) -} - -fn test_swap_governance(swaps: Vec<(u32, u32)>) { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let propmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: propmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: propmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - - let modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(modules.len(), 1); - let module_count = gov.proposal_module_count().unwrap(); - - assert_eq!( - module_count, - ProposalModuleCountResponse { - active_proposal_module_count: 1, - total_proposal_module_count: 1, - } - ); - - let (to_add, to_remove) = swaps - .iter() - .cloned() - .reduce(|(to_add, to_remove), (add, remove)| (to_add + add, to_remove + remove)) - .unwrap_or((0, 0)); - - for (add, remove) in swaps { - let start_modules = gov.proposal_modules(None, None).unwrap(); - - let start_modules_active: Vec = get_active_modules(&gov); - - get_active_modules(&gov); - gov_mod.set_address(&start_modules_active[0].address.clone()); - let to_add: Vec<_> = (0..add) - .map(|n| ModuleInstantiateInfo { - code_id: propmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: format!("governance module {n}"), - }) - .collect(); - - let to_disable: Vec<_> = start_modules_active - .iter() - .rev() - .take(remove as usize) - .map(|a| a.address.to_string()) - .collect(); - - gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) - .unwrap(), - } - .into()]) - .unwrap(); - - let finish_modules_active = get_active_modules(&gov); - - assert_eq!( - finish_modules_active.len() as u32, - start_modules_active.len() as u32 + add - remove - ); - for module in start_modules - .clone() - .into_iter() - .rev() - .take(remove as usize) - { - assert!(!finish_modules_active.contains(&module)) - } - - let state: DumpStateResponse = gov.dump_state().unwrap(); - assert_eq!( - state.active_proposal_module_count, - finish_modules_active.len() as u32 - ); - - assert_eq!( - state.total_proposal_module_count, - start_modules.len() as u32 + add - ) - } - - let module_count = gov.proposal_module_count().unwrap(); - assert_eq!( - module_count, - ProposalModuleCountResponse { - active_proposal_module_count: 1 + to_add - to_remove, - total_proposal_module_count: 1 + to_add, - } - ); -} - -#[test] -fn test_update_governance() { - test_swap_governance(vec![(1, 1), (5, 0), (0, 5), (0, 0)]); - test_swap_governance(vec![(1, 1), (1, 1), (1, 1), (1, 1)]) -} - -#[test] -fn test_add_then_remove_governance() { - test_swap_governance(vec![(1, 0), (0, 1)]) -} - -#[test] -#[should_panic(expected = "Execution would result in no proposal modules being active.")] -fn test_swap_governance_bad() { - test_swap_governance(vec![(1, 1), (0, 1)]) -} - -#[test] -fn test_removed_modules_can_not_execute() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - - let modules = gov.proposal_modules(None, None).unwrap(); - - assert_eq!(modules.len(), 1); - - let start_module = modules.into_iter().next().unwrap(); - gov_mod.set_address(&start_module.address); - - let to_add = vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "new governance module".to_string(), - }]; - - let to_disable = vec![start_module.address.to_string()]; - - // Swap ourselves out. - gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), - } - .into()]) - .unwrap(); - - let finish_modules_active = get_active_modules(&gov); - - let new_proposal_module = finish_modules_active.into_iter().next().unwrap(); - - // Try to add a new module and remove the one we added - // earlier. This should fail as we have been removed. - let to_add = vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "new governance module".to_string(), - }]; - let to_disable = vec![new_proposal_module.address.to_string()]; - - let err = gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { - to_add: to_add.clone(), - to_disable: to_disable.clone(), - }) - .unwrap(), - } - .into()]) - .unwrap_err(); - - assert_contains( - err, - ContractError::ModuleDisabledCannotExecute { - address: Addr::unchecked(""), - }, - ); - - // Check that the enabled query works. - let enabled_modules = gov.active_proposal_modules(None, None).unwrap(); - - assert_eq!(enabled_modules, vec![new_proposal_module.clone()]); - - // The new proposal module should be able to perform actions. - gov_mod.set_address(&new_proposal_module.address); - gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), - } - .into()]) - .unwrap(); -} - -#[test] -fn test_module_already_disabled() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - let modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(modules.len(), 1); - - let start_module = modules.into_iter().next().unwrap(); - gov_mod.set_address(&start_module.address); - - let to_disable = vec![ - start_module.address.to_string(), - start_module.address.to_string(), - ]; - - let err = gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { - to_add: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - to_disable, - }) - .unwrap(), - } - .into()]) - .unwrap_err(); - - assert_contains( - err, - ContractError::ModuleAlreadyDisabled { - address: start_module.address, - }, - ); -} - -#[test] -fn test_swap_voting_module() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - let modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(modules.len(), 1); - gov_mod.set_address(&modules[0].address); - - let voting_addr = gov.voting_module().unwrap(); - - gov_mod - .proposal_execute(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { - module: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - }) - .unwrap(), - } - .into()]) - .unwrap(); - - assert_ne!(gov.voting_module().unwrap(), voting_addr); -} - -fn test_unauthorized(gov: &DaoDaoCore, msg: ExecuteMsg) { - let err = gov.execute(&msg, None).unwrap_err(); - - assert_contains(err, ContractError::Unauthorized {}); -} - -#[test] -fn test_permissions() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - - test_unauthorized( - &gov, - ExecuteMsg::UpdateVotingModule { - module: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - }, - ); - - test_unauthorized( - &gov, - ExecuteMsg::UpdateProposalModules { - to_add: vec![], - to_disable: vec![], - }, - ); - - test_unauthorized( - &gov, - ExecuteMsg::UpdateConfig { - config: Config { - dao_uri: None, - name: "Evil config.".to_string(), - description: "👿".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }, - }, - ); -} - -fn do_standard_instantiate( - auto_add: bool, - admin: bool, -) -> ( - DaoDaoCore, - DaoProposalSudo, - MockBech32, - Option, -) { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let mut gov = DaoDaoCore::new("dao-core", mock.clone()); - let cw20 = Cw20Base::new("cw20", mock.clone()); - - gov_mod.upload().unwrap(); - voting.upload().unwrap(); - gov.upload().unwrap(); - cw20.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20.code_id().unwrap(), - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - let admin = admin.then(|| mock.addr_make("admin")); - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: admin.as_ref().map(|a| a.to_string()), - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: auto_add, - automatically_add_cw721s: auto_add, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting.code_id().unwrap(), - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: gov_mod.code_id().unwrap(), - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - - let proposal_modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - gov_mod.set_address(&proposal_module.address); - - if admin.is_none() { - gov = gov.call_as(&gov.address().unwrap()); - } - - (gov, gov_mod, mock, admin) -} - -#[test] -fn test_admin_permissions() { - let (core, proposal, mock, _) = do_standard_instantiate(true, false); - - let random = mock.addr_make("random"); - let start_height = mock.block_info().unwrap().height; - - // Random address can't call ExecuteAdminMsgs - core.call_as(&random) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - - // Proposal module can't call ExecuteAdminMsgs - core.call_as(&proposal.address().unwrap()) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - - // Update Admin can't be called by non-admins - core.call_as(&random) - .nominate_admin(Some(random.to_string())) - .unwrap_err(); - - // Nominate admin can be called by core contract as no admin was - // specified so the admin defaulted to the core contract. - - core.call_as(&proposal.address().unwrap()) - .execute_proposal_hook(vec![WasmMsg::Execute { - contract_addr: core.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - // Instantiate new DAO with an admin - let (core_with_admin, proposal_with_admin_address, mock, admin) = - do_standard_instantiate(true, true); - let admin = admin.unwrap(); - - // Non admins still can't call ExecuteAdminMsgs - core_with_admin - .call_as(&proposal_with_admin_address.address().unwrap()) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core_with_admin.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - - // Admin cannot directly pause the DAO - core_with_admin - .call_as(&admin) - .pause(Duration::Height(10)) - .unwrap_err(); - - // Random person cannot pause the DAO - core_with_admin - .call_as(&random) - .pause(Duration::Height(10)) - .unwrap_err(); - - // Admin can call ExecuteAdminMsgs, here an admin pauses the DAO - let _res = core_with_admin - .call_as(&admin) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core_with_admin.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - // Ensure we are paused for 10 blocks - assert_eq!( - core_with_admin.pause_info().unwrap(), - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - - // DAO unpauses after 10 blocks - mock.wait_blocks(11).unwrap(); - - // Check we are unpaused - assert_eq!( - core_with_admin.pause_info().unwrap(), - PauseInfoResponse::Unpaused {} - ); - - // Admin pauses DAO again - let _res = core_with_admin - .call_as(&admin) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core_with_admin.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - // DAO with admin cannot unpause itself - let _res = core_with_admin - .call_as(&core_with_admin.address().unwrap()) - .unpause() - .unwrap_err(); - - // Random person cannot unpause the DAO - let _res = core_with_admin.call_as(&random).unpause().unwrap_err(); - - // Admin can unpause the DAO directly - let _res = core_with_admin.call_as(&admin).unpause().unwrap(); - - // Check we are unpaused - - assert_eq!( - core_with_admin.pause_info().unwrap(), - PauseInfoResponse::Unpaused {} - ); - - // Admin can nominate a new admin. - let new_admin = mock.addr_make("meow"); - core_with_admin - .call_as(&admin) - .nominate_admin(Some(new_admin.to_string())) - .unwrap(); - - assert_eq!( - core_with_admin.admin_nomination().unwrap(), - AdminNominationResponse { - nomination: Some(new_admin.clone()) - } - ); - - // Check that admin has not yet been updated - assert_eq!(core_with_admin.admin().unwrap(), admin); - - // Only the nominated address may accept the nomination. - let err = core_with_admin - .call_as(&random) - .accept_admin_nomination() - .unwrap_err(); - - assert_contains(err, ContractError::Unauthorized {}); - - // Accept the nomination. - core_with_admin - .call_as(&new_admin) - .accept_admin_nomination() - .unwrap(); - - // Check that admin has been updated - assert_eq!(core_with_admin.admin().unwrap(), new_admin); - - // Check that the pending admin has been cleared. - assert_eq!( - core_with_admin.admin_nomination().unwrap(), - AdminNominationResponse { nomination: None } - ); -} - -#[test] -fn test_admin_nomination() { - let (core, _, mock, admin) = do_standard_instantiate(true, true); - - let admin = admin.unwrap(); - // Check that there is no pending nominations. - assert_eq!( - core.admin_nomination().unwrap(), - AdminNominationResponse { nomination: None } - ); - - // Nominate a new admin. - let ekez = mock.addr_make("ekez"); - core.call_as(&admin) - .nominate_admin(Some(ekez.to_string())) - .unwrap(); - - // Check that the nomination is in place. - assert_eq!( - core.admin_nomination().unwrap(), - AdminNominationResponse { - nomination: Some(ekez.clone()) - } - ); - - // Non-admin can not withdraw. - let err = core.call_as(&ekez).withdraw_admin_nomination().unwrap_err(); - assert_contains(err, ContractError::Unauthorized {}); - - // Admin can withdraw. - core.call_as(&admin).withdraw_admin_nomination().unwrap(); - - // Check that the nomination is withdrawn. - assert_eq!( - core.admin_nomination().unwrap(), - AdminNominationResponse { nomination: None } - ); - - // Can not withdraw if no nomination is pending. - let err = core - .call_as(&admin) - .withdraw_admin_nomination() - .unwrap_err(); - - assert_contains(err, ContractError::NoAdminNomination {}); - - // Can not claim nomination b/c it has been withdrawn. - let err = core.call_as(&admin).accept_admin_nomination().unwrap_err(); - - assert_contains(err, ContractError::NoAdminNomination {}); - - // Nominate a new admin. - let meow = mock.addr_make("meow"); - core.call_as(&admin) - .nominate_admin(Some(meow.to_string())) - .unwrap(); - - // A new nomination can not be created if there is already a - // pending nomination. - let err = core - .call_as(&admin) - .nominate_admin(Some(ekez.to_string())) - .unwrap_err(); - assert_contains(err, ContractError::PendingNomination {}); - - // Only nominated admin may accept. - let err = core.call_as(&ekez).accept_admin_nomination().unwrap_err(); - assert_contains(err, ContractError::Unauthorized {}); - - core.call_as(&meow).accept_admin_nomination().unwrap(); - - // Check that meow is the new admin. - assert_eq!(core.admin().unwrap(), meow); - - let start_height = mock.block_info().unwrap().height; - // Check that the new admin can do admin things and the old can not. - let err = core - .call_as(&admin) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - assert_contains(err, ContractError::Unauthorized {}); - - core.call_as(&meow) - .execute_admin_msgs(vec![WasmMsg::Execute { - contract_addr: core.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - assert_eq!( - core.pause_info().unwrap(), - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - - // DAO unpauses after 10 blocks - mock.wait_blocks(11).unwrap(); - - // Remove the admin. - core.call_as(&meow).nominate_admin(None).unwrap(); - - // Check that this has not caused an admin to be nominated. - assert_eq!( - core.admin_nomination().unwrap(), - AdminNominationResponse { nomination: None } - ); - - // Check that admin has been updated. As there was no admin - // nominated the admin should revert back to the contract address. - assert_eq!(core.admin().unwrap(), core.address().unwrap()); -} - -#[test] -fn test_passthrough_voting_queries() { - let (gov, _, mock, _) = do_standard_instantiate(true, false); - - assert_eq!( - gov.voting_power_at_height(mock.sender().to_string(), None) - .unwrap(), - VotingPowerAtHeightResponse { - power: Uint128::from(2u64), - height: mock.block_info().unwrap().height, - } - ); -} - -#[test] -fn test_item_permissions() { - let (gov, _, mock, _) = do_standard_instantiate(true, false); - - let ekez = mock.addr_make("ekez"); - let err = gov - .call_as(&ekez) - .set_item("k".to_string(), "v".to_string()) - .unwrap_err(); - assert_contains(err, ContractError::Unauthorized {}); - - let err = gov.call_as(&ekez).remove_item("k".to_string()).unwrap_err(); - assert_contains(err, ContractError::Unauthorized {}); -} - -#[test] -fn test_add_remove_get() { - let (gov, _, _mock, _) = do_standard_instantiate(true, false); - - let a = gov.get_item("aaaaa".to_string()).unwrap(); - assert_eq!(a, GetItemResponse { item: None }); - - gov.set_item("aaaaakey".to_string(), "aaaaaaddr".to_string()) - .unwrap(); - let a = gov.get_item("aaaaakey".to_string()).unwrap(); - assert_eq!( - a, - GetItemResponse { - item: Some("aaaaaaddr".to_string()) - } - ); - - gov.remove_item("aaaaakey".to_string()).unwrap(); - let a = gov.get_item("aaaaakey".to_string()).unwrap(); - assert_eq!(a, GetItemResponse { item: None }); -} - -#[test] -#[should_panic(expected = "Key is missing from storage")] -fn test_remove_missing_key() { - let (gov, _, _, _) = do_standard_instantiate(true, false); - gov.remove_item("b".to_string()).unwrap(); -} - -#[test] -fn test_list_items() { - let mock = MockBech32::new("mock"); - let govmod = DaoProposalSudo::new("proposal", mock.clone()); - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - let cw20 = Cw20Base::new("cw20", mock.clone()); - - govmod.upload().unwrap(); - voting.upload().unwrap(); - gov.upload().unwrap(); - cw20.upload().unwrap(); - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20.code_id().unwrap(), - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting.code_id().unwrap(), - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod.code_id().unwrap(), - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - let gov = gov.call_as(&gov.address().unwrap()); - - gov.set_item("fookey".to_string(), "fooaddr".to_string()) - .unwrap(); - gov.set_item("barkey".to_string(), "baraddr".to_string()) - .unwrap(); - gov.set_item("loremkey".to_string(), "loremaddr".to_string()) - .unwrap(); - gov.set_item("ipsumkey".to_string(), "ipsumaddr".to_string()) - .unwrap(); - - // Foo returned as we are only getting one item and items are in - // decending order. - let first_item = gov.list_items(Some(1), None).unwrap(); - assert_eq!(first_item.len(), 1); - assert_eq!( - first_item[0], - ("loremkey".to_string(), "loremaddr".to_string()) - ); - - let no_items = gov.list_items(Some(0), None).unwrap(); - assert_eq!(no_items.len(), 0); - - // Items are retreived in decending order so asking for foo with - // no limit ought to give us the barkey k/v. this will be the last item - // note: the paginate map bound is exclusive, so fookey will be starting point - let last_item = gov.list_items(None, Some("foo".to_string())).unwrap(); - - assert_eq!(last_item.len(), 1); - assert_eq!(last_item[0], ("barkey".to_string(), "baraddr".to_string())); - - // Items are retreived in decending order so asking for ipsum with - // 4 limit ought to give us the fookey and barkey k/vs. - let after_foo_list = gov.list_items(Some(4), Some("ipsum".to_string())).unwrap(); - assert_eq!(after_foo_list.len(), 2); - assert_eq!( - after_foo_list, - vec![ - ("fookey".to_string(), "fooaddr".to_string()), - ("barkey".to_string(), "baraddr".to_string()) - ] - ); -} - -#[test] -fn test_instantiate_with_items() { - let mock = MockBech32::new("mock"); - let govmod = DaoProposalSudo::new("proposal", mock.clone()); - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - let cw20 = Cw20Base::new("cw20", mock.clone()); - - govmod.upload().unwrap(); - voting.upload().unwrap(); - gov.upload().unwrap(); - cw20.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20.code_id().unwrap(), - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - let mut initial_items = vec![ - InitialItem { - key: "item0".to_string(), - value: "item0_value".to_string(), - }, - InitialItem { - key: "item1".to_string(), - value: "item1_value".to_string(), - }, - InitialItem { - key: "item0".to_string(), - value: "item0_value_override".to_string(), - }, - ]; - - let mut gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting.code_id().unwrap(), - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod.code_id().unwrap(), - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: Some(initial_items.clone()), - }; - - // Ensure duplicates are dissallowed. - let err = gov.instantiate(&gov_instantiate, None, None).unwrap_err(); - assert_contains( - err, - ContractError::DuplicateInitialItem { - item: "item0".to_string(), - }, - ); - - initial_items.pop(); - gov_instantiate.initial_items = Some(initial_items); - let _gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); - - // Ensure initial items were added. - let items = gov.list_items(None, None).unwrap(); - assert_eq!(items.len(), 2); - - // Descending order, so item1 is first. - assert_eq!(items[1].0, "item0".to_string()); - let get_item0 = gov.get_item("item0".to_string()).unwrap(); - - assert_eq!( - get_item0, - GetItemResponse { - item: Some("item0_value".to_string()), - } - ); - - assert_eq!(items[0].0, "item1".to_string()); - let item1_value = gov.get_item("item1".to_string()).unwrap().item; - assert_eq!(item1_value, Some("item1_value".to_string())) -} - -#[test] -fn test_cw20_receive_auto_add() { - let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); - let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); - another_cw20.upload().unwrap(); - another_cw20 - .instantiate( - &abstract_cw20_base::msg::InstantiateMsg { - name: "DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![], - mint: None, - marketing: None, - }, - None, - None, - ) - .unwrap(); - - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - voting.set_address(&gov.voting_module().unwrap()); - - let gov_token = Cw20Base::new("cw20", mock.clone()); - - gov_token.set_address(&voting.token_contract().unwrap()); - // Check that the balances query works with no tokens. - let cw20_balances = gov.cw_20_balances(None, None).unwrap(); - assert_eq!(cw20_balances, vec![]); - - // Send a gov token to the governance contract. - gov_token - .send( - Uint128::new(1), - gov.address().unwrap().to_string(), - to_json_binary(&"").unwrap(), - ) - .unwrap(); - - let cw20_list = gov.cw_20_token_list(None, None).unwrap(); - assert_eq!( - cw20_list, - vec![gov_token.address().unwrap().to_string().clone()] - ); - - assert_eq!( - gov.cw_20_balances(None, None).unwrap(), - vec![Cw20BalanceResponse { - addr: gov_token.address().unwrap(), - balance: Uint128::new(1), - }] - ); - - // Test removing and adding some new ones. Invalid should fail. - let err = gov - .update_cw_20_list( - vec![mock.addr_make("new").to_string()], - vec![gov_token.address().unwrap().to_string()], - ) - .unwrap_err(); - println!("{:?}", err); - assert_contains(&err, "key:"); - assert_contains(err, "not found"); - - // Test that non-DAO can not update the list. - let err = gov - .call_as(&mock.addr_make("ekez")) - .update_cw_20_list(vec![], vec![gov_token.address().unwrap().to_string()]) - .unwrap_err(); - - assert_contains(err, ContractError::Unauthorized {}); - - gov.update_cw_20_list( - vec![another_cw20.address().unwrap().to_string()], - vec![gov_token.address().unwrap().to_string()], - ) - .unwrap(); - - let cw20_list = gov.cw_20_token_list(None, None).unwrap(); - assert_eq!(cw20_list, vec![another_cw20.address().unwrap().to_string()]); -} - -#[test] -fn test_cw20_receive_no_auto_add() { - let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - - let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); - another_cw20.upload().unwrap(); - another_cw20 - .instantiate( - &abstract_cw20_base::msg::InstantiateMsg { - name: "DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![], - mint: None, - marketing: None, - }, - None, - None, - ) - .unwrap(); - - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - voting.set_address(&gov.voting_module().unwrap()); - - let gov_token = Cw20Base::new("cw20", mock.clone()); - gov_token.set_address(&voting.token_contract().unwrap()); - - // Send a gov token to the governance contract. Should not be - // added becasue auto add is turned off. - gov_token - .send( - Uint128::new(1), - gov.address().unwrap().to_string(), - to_json_binary(&"").unwrap(), - ) - .unwrap(); - - assert_eq!( - gov.cw_20_token_list(None, None).unwrap(), - Vec::::new() - ); - - gov.update_cw_20_list( - vec![ - another_cw20.address().unwrap().to_string(), - gov_token.address().unwrap().to_string(), - ], - vec![mock.addr_make("ok to remove non existent").to_string()], - ) - .unwrap(); - - assert_eq!( - gov.cw_20_token_list(None, None).unwrap(), - vec![ - gov_token.address().unwrap(), - another_cw20.address().unwrap(), - ] - ); -} - -#[test] -fn test_cw721_receive() { - let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); - - let cw721 = Cw721Base::new("cw721", mock.clone()); - cw721.upload().unwrap(); - cw721 - .instantiate( - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: mock.sender().to_string(), - }, - None, - None, - ) - .unwrap(); - - let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); - another_cw721.set_code_id(cw721.code_id().unwrap()); - another_cw721 - .instantiate( - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: mock.sender().to_string(), - }, - None, - None, - ) - .unwrap(); - - cw721 - .execute( - &cw721_base::msg::ExecuteMsg::, Empty>::Mint { - token_id: "ekez".to_string(), - owner: mock.sender().to_string(), - token_uri: None, - extension: None, - }, - None, - ) - .unwrap(); - - cw721 - .execute( - &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { - contract: gov.address().unwrap().to_string(), - token_id: "ekez".to_string(), - msg: to_json_binary("").unwrap(), - }, - None, - ) - .unwrap(); - - assert_eq!( - gov.cw_721_token_list(None, None).unwrap(), - vec![cw721.address().unwrap().clone()] - ); - - // Try to add an invalid cw721. - let err = gov - .update_cw_721_list( - vec![ - mock.addr_make("new").to_string(), - cw721.address().unwrap().clone().to_string(), - ], - vec![cw721.address().unwrap().clone().to_string()], - ) - .unwrap_err(); - - println!("{:?}", err); - assert_contains(&err, "key:"); - assert_contains(err, "not found"); - // assert!(matches!(err, ContractError::Std(_))); - - // Test that non-DAO can not update the list. - let err = gov - .call_as(&mock.addr_make("ekez")) - .update_cw_721_list(vec![], vec![cw721.address().unwrap().clone().to_string()]) - .unwrap_err(); - - assert_contains(err, ContractError::Unauthorized {}); - - // Add a real cw721. - gov.update_cw_721_list( - vec![ - cw721.address().unwrap().to_string(), - another_cw721.address().unwrap().to_string(), - ], - vec![cw721.address().unwrap().to_string()], - ) - .unwrap(); - - assert_eq!( - gov.cw_721_token_list(None, None).unwrap(), - vec![another_cw721.address().unwrap()] - ); -} - -#[test] -fn test_cw721_receive_no_auto_add() { - let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - - let cw721 = Cw721Base::new("cw721", mock.clone()); - cw721.upload().unwrap(); - cw721 - .instantiate( - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: mock.sender().to_string(), - }, - None, - None, - ) - .unwrap(); - - let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); - another_cw721.set_code_id(cw721.code_id().unwrap()); - another_cw721 - .instantiate( - &cw721_base::msg::InstantiateMsg { - name: "ekez".to_string(), - symbol: "ekez".to_string(), - minter: mock.sender().to_string(), - }, - None, - None, - ) - .unwrap(); - - assert_eq!( - gov.cw_721_token_list(None, None).unwrap(), - Vec::::new() - ); - - // Duplicates OK. Just adds one. - gov.update_cw_721_list( - vec![ - another_cw721.address().unwrap().to_string(), - cw721.address().unwrap().to_string(), - cw721.address().unwrap().to_string(), - ], - vec![], - ) - .unwrap(); - - assert_eq!( - gov.cw_721_token_list(None, None).unwrap(), - vec![another_cw721.address().unwrap(), cw721.address().unwrap()] - ); -} - -#[test] -fn test_pause() { - let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - - let start_height = mock.block_info().unwrap().height; - - let proposal_modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - - assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); - - assert_eq!( - gov.dump_state().unwrap().pause_info, - PauseInfoResponse::Unpaused {} - ); - - // DAO is not paused. Check that we can execute things. - // - // Tests intentionally use the core address to send these - // messsages to simulate a worst case scenerio where the core - // contract has a vulnerability. - gov.update_config(Config { - dao_uri: None, - name: "The Empire Strikes Back".to_string(), - description: "haha lol we have pwned your DAO".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }) - .unwrap(); - - // Oh no the DAO is under attack! Quick! Pause the DAO while we - // figure out what to do! - let err = gov - .call_as(&proposal_module.address) - .pause(Duration::Height(10)) - .unwrap_err(); - - // Only the DAO may call this on itself. Proposal modules must use - // the execute hook. - assert_contains(err, ContractError::Unauthorized {}); - gov.call_as(&proposal_module.address) - .execute_proposal_hook(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - assert_eq!( - gov.pause_info().unwrap(), - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - assert_eq!( - gov.dump_state().unwrap().pause_info, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 10) - } - ); - - // This should actually be allowed to enable the admin to execute - gov.update_config(Config { - dao_uri: None, - name: "The Empire Strikes Back Again".to_string(), - description: "haha lol we have pwned your DAO again".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }) - .unwrap(); - - let err = gov - .call_as(&proposal_module.address) - .execute_proposal_hook(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - - assert_contains(err, ContractError::Paused {}); - - mock.wait_blocks(9).unwrap(); - - // Still not unpaused. - - let err = gov - .call_as(&proposal_module.address) - .execute_proposal_hook(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap_err(); - - assert_contains(err, ContractError::Paused {}); - - mock.wait_blocks(1).unwrap(); - - assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); - assert_eq!( - gov.dump_state().unwrap().pause_info, - PauseInfoResponse::Unpaused {} - ); - - // Now its unpaused so we should be able to pause again. - gov.call_as(&proposal_module.address) - .execute_proposal_hook(vec![WasmMsg::Execute { - contract_addr: gov.address().unwrap().to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()]) - .unwrap(); - - assert_eq!( - gov.pause_info().unwrap(), - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 20) - } - ); - assert_eq!( - gov.dump_state().unwrap().pause_info, - PauseInfoResponse::Paused { - expiration: Expiration::AtHeight(start_height + 20) - } - ); -} - -#[test] -fn test_dump_state_proposal_modules() { - let (gov, _proposal, _mock, _) = do_standard_instantiate(false, false); - let proposal_modules = gov.proposal_modules(None, None).unwrap(); - - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - - let all_state: DumpStateResponse = gov.dump_state().unwrap(); - assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); - assert_eq!(all_state.proposal_modules.len(), 1); - assert_eq!(all_state.proposal_modules[0], proposal_module); -} - -// Note that this isn't actually testing that we are migrating from the previous version since -// with multitest contract instantiation we can't manipulate storage to the previous version of state before invoking migrate. So if anything, -// this just tests the idempotency of migrate. -#[test] -fn test_migrate_from_compatible() { - let mock = MockBech32::new("mock"); - let govmod = DaoProposalSudo::new("proposal", mock.clone()); - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - let cw20 = Cw20Base::new("cw20", mock.clone()); - - govmod.upload().unwrap(); - voting.upload().unwrap(); - gov.upload().unwrap(); - cw20.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20.code_id().unwrap(), - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - // Instantiate the core module with an admin to do migrations. - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting.code_id().unwrap(), - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod.code_id().unwrap(), - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, Some(&mock.sender()), None) - .unwrap(); - - let state = gov.dump_state().unwrap(); - - gov.migrate(&MigrateMsg::FromCompatible {}, gov.code_id().unwrap()) - .unwrap(); - - let new_state = gov.dump_state().unwrap(); - - assert_eq!(new_state, state); -} - -#[test] -fn test_migrate_from_beta() { - use cw_core_v1 as v1; - - let mock = MockBech32::new("mock"); - let govmod = DaoProposalSudo::new("proposal", mock.clone()); - let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - let v1_gov = DaoDaoCoreV1::new("dao-core-v1", mock.clone()); - let cw20 = Cw20Base::new("cw20", mock.clone()); - - govmod.upload().unwrap(); - voting.upload().unwrap(); - gov.upload().unwrap(); - v1_gov.upload().unwrap(); - cw20.upload().unwrap(); - - let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { - token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20.code_id().unwrap(), - label: "DAO DAO voting".to_string(), - name: "DAO DAO".to_string(), - symbol: "DAO".to_string(), - decimals: 6, - initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), - amount: Uint128::from(2u64), - }], - marketing: None, - }, - }; - - // Instantiate the core module with an admin to do migrations. - let v1_core_instantiate = v1::msg::InstantiateMsg { - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { - code_id: voting.code_id().unwrap(), - msg: to_json_binary(&voting_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ - v1::msg::ModuleInstantiateInfo { - code_id: govmod.code_id().unwrap(), - msg: to_json_binary(&proposal_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "governance module 1".to_string(), - }, - v1::msg::ModuleInstantiateInfo { - code_id: govmod.code_id().unwrap(), - msg: to_json_binary(&proposal_instantiate).unwrap(), - admin: v1::msg::Admin::CoreContract {}, - label: "governance module 2".to_string(), - }, - ], - initial_items: None, - }; - - v1_gov - .instantiate(&v1_core_instantiate, Some(&mock.sender()), None) - .unwrap(); - - gov.set_address(&v1_gov.address().unwrap()); - gov.migrate( - &MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }, - gov.code_id().unwrap(), - ) - .unwrap(); - - let new_state = gov.dump_state().unwrap(); - - let proposal_modules = new_state.proposal_modules; - assert_eq!(2, proposal_modules.len()); - for (idx, module) in proposal_modules.iter().enumerate() { - let prefix = derive_proposal_module_prefix(idx).unwrap(); - assert_eq!(prefix, module.prefix); - assert_eq!(ProposalModuleStatus::Enabled, module.status); - } - - // Check that we may not migrate more than once. - let err = gov - .migrate( - &MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }, - gov.code_id().unwrap(), - ) - .unwrap_err(); - - assert_contains(err, ContractError::AlreadyMigrated {}) -} - -#[test] -fn test_migrate_mock() { - let mut deps = mock_dependencies(); - let dao_uri: String = "/dao/uri".to_string(); - let msg = MigrateMsg::FromV1 { - dao_uri: Some(dao_uri.clone()), - params: None, - }; - let env = mock_env(); - - // Set starting version to v1. - set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.1.0").unwrap(); - - // Write to storage in old proposal module format - let proposal_modules_key = Addr::unchecked("addr"); - let old_map: Map = Map::new("proposal_modules"); - let path = old_map.key(proposal_modules_key.clone()); - deps.storage.set(&path, &to_json_binary(&Empty {}).unwrap()); - - // Write to storage in old config format - #[cw_serde] - struct V1Config { - pub name: String, - pub description: String, - pub image_url: Option, - pub automatically_add_cw20s: bool, - pub automatically_add_cw721s: bool, - } - - let v1_config = V1Config { - name: "core dao".to_string(), - description: "a dao".to_string(), - image_url: None, - automatically_add_cw20s: false, - automatically_add_cw721s: false, - }; - - let config_item: Item = Item::new("config"); - config_item.save(&mut deps.storage, &v1_config).unwrap(); - - // Migrate to v2 - migrate(deps.as_mut(), env, msg).unwrap(); - - let new_path = PROPOSAL_MODULES.key(proposal_modules_key); - let prop_module_bytes = deps.storage.get(&new_path).unwrap(); - let module: ProposalModule = from_json(prop_module_bytes).unwrap(); - assert_eq!(module.address, Addr::unchecked("addr")); - assert_eq!(module.prefix, derive_proposal_module_prefix(0).unwrap()); - assert_eq!(module.status, ProposalModuleStatus::Enabled {}); - - let v2_config_item: Item = Item::new("config_v2"); - let v2_config = v2_config_item.load(&deps.storage).unwrap(); - assert_eq!(v2_config.dao_uri, Some(dao_uri)); - assert_eq!(v2_config.name, v1_config.name); - assert_eq!(v2_config.description, v1_config.description); - assert_eq!(v2_config.image_url, v1_config.image_url); - assert_eq!( - v2_config.automatically_add_cw20s, - v1_config.automatically_add_cw20s - ); - assert_eq!( - v2_config.automatically_add_cw721s, - v1_config.automatically_add_cw721s - ) -} - -#[test] -fn test_execute_stargate_msg() { - let (gov, _proposal, _mock, _) = do_standard_instantiate(true, false); - let proposal_modules = gov.proposal_modules(None, None).unwrap(); - - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); - - let res = gov - .call_as(&proposal_module.address) - .execute_proposal_hook(vec![CosmosMsg::Stargate { - type_url: "foo_type".to_string(), - value: to_json_binary("foo_bin").unwrap(), - }]); - - // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert - assert!(res.is_err()); -} - -#[test] -fn test_module_prefixes() { - let mock = MockBech32::new("mock"); - let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); - let gov = DaoDaoCore::new("dao-core", mock.clone()); - gov_mod.upload().unwrap(); - let govmod_id = gov_mod.code_id().unwrap(); - gov.upload().unwrap(); - - let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), - }; - - let gov_instantiate = InstantiateMsg { - dao_uri: None, - admin: None, - name: "DAO DAO".to_string(), - description: "A DAO that builds DAOs.".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - proposal_modules_instantiate_info: vec![ - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 1".to_string(), - }, - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 2".to_string(), - }, - ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "proposal module 2".to_string(), - }, - ], - initial_items: None, - }; - - gov.instantiate(&gov_instantiate, None, None).unwrap(); - - let modules = gov.proposal_modules(None, None).unwrap(); - assert_eq!(modules.len(), 3); - - let module_1 = &modules[0]; - assert_eq!(module_1.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_1.prefix, "A"); - assert_eq!(&module_1.address, &modules[0].address); - - let module_2 = &modules[1]; - assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_2.prefix, "C"); - assert_eq!(&module_2.address, &modules[1].address); - - let module_3 = &modules[2]; - assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_3.prefix, "B"); - assert_eq!(&module_3.address, &modules[2].address); -} - -fn get_active_modules(gov: &DaoDaoCore) -> Vec { - let modules = gov.proposal_modules(None, None).unwrap(); - - modules - .into_iter() - .filter(|module: &ProposalModule| module.status == ProposalModuleStatus::Enabled) - .collect() -} - -#[test] -fn test_add_remove_subdaos() { - let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - - test_unauthorized( - &gov.call_as(&mock.sender()), - ExecuteMsg::UpdateSubDaos { - to_add: vec![], - to_remove: vec![], - }, - ); - - let to_add: Vec = vec![ - SubDao { - addr: mock.addr_make("subdao001").to_string(), - charter: None, - }, - SubDao { - addr: mock.addr_make("subdao002").to_string(), - charter: Some("cool charter bro".to_string()), - }, - SubDao { - addr: mock.addr_make("subdao005").to_string(), - charter: None, - }, - SubDao { - addr: mock.addr_make("subdao007").to_string(), - charter: None, - }, - ]; - let to_remove: Vec = vec![]; - - gov.update_sub_daos(to_add, to_remove).unwrap(); - - assert_eq!(gov.list_sub_daos(None, None).unwrap().len(), 4); - - let to_remove: Vec = vec![mock.addr_make("subdao005").to_string()]; - - gov.update_sub_daos(vec![], to_remove).unwrap(); - - let res = gov.list_sub_daos(None, None).unwrap(); - - assert_eq!(res.len(), 3); - let full_result_set: Vec = vec![ - SubDao { - addr: mock.addr_make("subdao001").to_string(), - charter: None, - }, - SubDao { - addr: mock.addr_make("subdao002").to_string(), - charter: Some("cool charter bro".to_string()), - }, - SubDao { - addr: mock.addr_make("subdao007").to_string(), - charter: None, - }, - ]; - - assert_eq!(res, full_result_set); -} - -#[test] -pub fn test_migrate_update_version() { - let mut deps = mock_dependencies(); - cw2::set_contract_version(&mut deps.storage, "my-contract", "old-version").unwrap(); - migrate(deps.as_mut(), mock_env(), MigrateMsg::FromCompatible {}).unwrap(); - let version = cw2::get_contract_version(&deps.storage).unwrap(); - assert_eq!(version.version, CONTRACT_VERSION); - assert_eq!(version.contract, CONTRACT_NAME); -} - -#[test] -fn test_query_info() { - let (gov, _, _, _) = do_standard_instantiate(true, false); - assert_eq!( - gov.info().unwrap(), - InfoResponse { - info: ContractVersion { - contract: CONTRACT_NAME.to_string(), - version: CONTRACT_VERSION.to_string() - } - } - ) -} diff --git a/contracts/dao-dao-core/src/lib.rs b/contracts/dao-dao-core/src/lib.rs index e1d62aad4..20a9a57d7 100644 --- a/contracts/dao-dao-core/src/lib.rs +++ b/contracts/dao-dao-core/src/lib.rs @@ -4,8 +4,6 @@ pub mod contract; mod error; pub mod state; -#[cfg(test)] -mod cw_orch_tests; #[cfg(test)] mod tests; diff --git a/contracts/dao-dao-core/src/tests.rs b/contracts/dao-dao-core/src/tests.rs index 81dd040cb..e20eab146 100644 --- a/contracts/dao-dao-core/src/tests.rs +++ b/contracts/dao-dao-core/src/tests.rs @@ -1,3 +1,12 @@ +use crate::{ + contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, + state::PROPOSAL_MODULES, + ContractError, +}; +use abstract_cw20::msg::Cw20ExecuteMsgFns; +use abstract_cw_plus_interface::cw20_base::Cw20Base; +use v1::DaoDaoCoreV1; + use cosmwasm_schema::cw_serde; use cosmwasm_std::{ from_json, @@ -5,99 +14,64 @@ use cosmwasm_std::{ to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, }; use cw2::{set_contract_version, ContractVersion}; -use cw_multi_test::{App, Contract, ContractWrapper, Executor}; +use cw_orch::prelude::*; + use cw_storage_plus::{Item, Map}; use cw_utils::{Duration, Expiration}; +use dao_cw_orch::Cw721Base; +use dao_cw_orch::{DaoDaoCore, DaoProposalSudo, DaoVotingCw20Balance}; +use dao_interface::CoreExecuteMsgFns; +use dao_interface::CoreQueryMsgFns; use dao_interface::{ - msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg, QueryMsg}, + msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateMsg}, query::{ - AdminNominationResponse, Cw20BalanceResponse, DaoURIResponse, DumpStateResponse, - GetItemResponse, PauseInfoResponse, ProposalModuleCountResponse, SubDao, + AdminNominationResponse, Cw20BalanceResponse, DumpStateResponse, GetItemResponse, + PauseInfoResponse, ProposalModuleCountResponse, SubDao, }, state::{Admin, Config, ModuleInstantiateInfo, ProposalModule, ProposalModuleStatus}, voting::{InfoResponse, VotingPowerAtHeightResponse}, }; +use dao_proposal_sudo::msg::ExecuteMsgFns as _; +use dao_voting_cw20_balance::msg::QueryMsgFns; -use crate::{ - contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, - state::PROPOSAL_MODULES, - ContractError, -}; - -const CREATOR_ADDR: &str = "creator"; - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn cw721_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_base::entry::execute, - cw721_base::entry::instantiate, - cw721_base::entry::query, - ); - Box::new(contract) -} - -fn sudo_proposal_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_sudo::contract::execute, - dao_proposal_sudo::contract::instantiate, - dao_proposal_sudo::contract::query, - ); - Box::new(contract) +pub fn assert_contains(e: impl std::fmt::Debug, el: impl ToString) { + assert!(format!("{:?}", e).contains(&el.to_string())) } -fn cw20_balances_voting() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_balance::contract::execute, - dao_voting_cw20_balance::contract::instantiate, - dao_voting_cw20_balance::contract::query, - ) - .with_reply(dao_voting_cw20_balance::contract::reply); - Box::new(contract) -} +pub mod v1 { + use cw_orch::{interface, prelude::*}; -fn cw_core_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} + use cw_core_v1::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -fn v1_cw_core_contract() -> Box> { - use cw_core_v1::contract; - let contract = ContractWrapper::new(contract::execute, contract::instantiate, contract::query) - .with_reply(contract::reply) - .with_migrate(contract::migrate); - Box::new(contract) -} + #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] + pub struct DaoDaoCoreV1; -fn instantiate_gov(app: &mut App, code_id: u64, msg: InstantiateMsg) -> Addr { - app.instantiate_contract( - code_id, - Addr::unchecked(CREATOR_ADDR), - &msg, - &[], - "cw-governance", - None, - ) - .unwrap() + impl Uploadable for DaoDaoCoreV1 { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_dao_core") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + use cw_core_v1::contract; + Box::new( + ContractWrapper::new(contract::execute, contract::instantiate, contract::query) + .with_reply(contract::reply) + .with_migrate(contract::migrate), + ) + } + } } fn test_instantiate_with_n_gov_modules(n: usize) { - let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let cw20 = Cw20Base::new("cw20", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + cw20.upload().unwrap(); + let cw20_id = cw20.code_id().unwrap(); + gov.upload().unwrap(); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), @@ -133,12 +107,9 @@ fn test_instantiate_with_n_gov_modules(n: usize) { .collect(), initial_items: None, }; - let gov_addr = instantiate_gov(&mut app, gov_id, instantiate); + gov.instantiate(&instantiate, None, None).unwrap(); - let state: DumpStateResponse = app - .wrap() - .query_wasm_smart(gov_addr, &QueryMsg::DumpState {}) - .unwrap(); + let state = gov.dump_state().unwrap(); assert_eq!( state.config, @@ -173,11 +144,16 @@ fn test_valid_instantiate() { } #[test] -#[should_panic(expected = "Error parsing into type cw20_base::msg::InstantiateMsg: Invalid type")] +#[should_panic( + expected = "Error parsing into type abstract_cw20_base::msg::InstantiateMsg: Invalid type" +)] fn test_instantiate_with_submessage_failure() { - let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let cw20 = Cw20Base::new("cw20", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + cw20.upload().unwrap(); + let cw20_id = cw20.code_id().unwrap(); + gov.upload().unwrap(); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), @@ -233,17 +209,21 @@ makes wickedness." proposal_modules_instantiate_info: governance_modules, initial_items: None, }; - instantiate_gov(&mut app, gov_id, instantiate); + + gov.instantiate(&instantiate, None, None).unwrap(); } #[test] -fn test_update_config() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); +fn test_update_config() -> cw_orch::anyhow::Result<()> { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload()?; + let govmod_id = gov_mod.code_id()?; + gov.upload()?; let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -256,14 +236,14 @@ fn test_update_config() { automatically_add_cw721s: true, voting_module_instantiate_info: ModuleInstantiateInfo { code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), + msg: to_json_binary(&govmod_instantiate)?, admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), + msg: to_json_binary(&govmod_instantiate)?, admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), @@ -271,29 +251,11 @@ fn test_update_config() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None)?; + let modules = gov.proposal_modules(None, None)?; assert_eq!(modules.len(), 1); + gov_mod.set_address(&modules[0].clone().address); let expected_config = Config { name: "Root DAO".to_string(), @@ -304,45 +266,31 @@ fn test_update_config() { dao_uri: Some("https://daostar.one/EIP".to_string()), }; - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - modules[0].clone().address, - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateConfig { - config: expected_config.clone(), - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); - - let config: Config = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::Config {}) - .unwrap(); + gov_mod.proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address()?.to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateConfig { + config: expected_config.clone(), + })?, + } + .into()])?; - assert_eq!(expected_config, config); + assert_eq!(expected_config, gov.config()?); - let dao_uri: DaoURIResponse = app - .wrap() - .query_wasm_smart(gov_addr, &QueryMsg::DaoURI {}) - .unwrap(); - assert_eq!(dao_uri.dao_uri, expected_config.dao_uri); + assert_eq!(gov.dao_uri()?.dao_uri, expected_config.dao_uri); + Ok(()) } fn test_swap_governance(swaps: Vec<(u32, u32)>) { - let mut app = App::default(); - let propmod_id = app.store_code(sudo_proposal_contract()); - let core_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let propmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -370,31 +318,12 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - core_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); + let module_count = gov.proposal_module_count().unwrap(); - let module_count = query_proposal_module_count(&app, &gov_addr); assert_eq!( module_count, ProposalModuleCountResponse { @@ -410,19 +339,12 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { .unwrap_or((0, 0)); for (add, remove) in swaps { - let start_modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let start_modules = gov.proposal_modules(None, None).unwrap(); - let start_modules_active: Vec = get_active_modules(&app, gov_addr.clone()); + let start_modules_active: Vec = get_active_modules(&gov); + get_active_modules(&gov); + gov_mod.set_address(&start_modules_active[0].address.clone()); let to_add: Vec<_> = (0..add) .map(|n| ModuleInstantiateInfo { code_id: propmod_id, @@ -440,23 +362,17 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { .map(|a| a.address.to_string()) .collect(); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - start_modules_active[0].address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) + .unwrap(), + } + .into()]) + .unwrap(); - let finish_modules_active = get_active_modules(&app, gov_addr.clone()); + let finish_modules_active = get_active_modules(&gov); assert_eq!( finish_modules_active.len() as u32, @@ -471,11 +387,7 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { assert!(!finish_modules_active.contains(&module)) } - let state: DumpStateResponse = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - + let state: DumpStateResponse = gov.dump_state().unwrap(); assert_eq!( state.active_proposal_module_count, finish_modules_active.len() as u32 @@ -487,7 +399,7 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { ) } - let module_count = query_proposal_module_count(&app, &gov_addr); + let module_count = gov.proposal_module_count().unwrap(); assert_eq!( module_count, ProposalModuleCountResponse { @@ -516,12 +428,15 @@ fn test_swap_governance_bad() { #[test] fn test_removed_modules_can_not_execute() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -549,31 +464,14 @@ fn test_removed_modules_can_not_execute() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); let start_module = modules.into_iter().next().unwrap(); + gov_mod.set_address(&start_module.address); let to_add = vec![ModuleInstantiateInfo { code_id: govmod_id, @@ -586,23 +484,16 @@ fn test_removed_modules_can_not_execute() { let to_disable = vec![start_module.address.to_string()]; // Swap ourselves out. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - start_module.address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), + } + .into()]) + .unwrap(); - let finish_modules_active: Vec = get_active_modules(&app, gov_addr.clone()); + let finish_modules_active = get_active_modules(&gov); let new_proposal_module = finish_modules_active.into_iter().next().unwrap(); @@ -617,74 +508,54 @@ fn test_removed_modules_can_not_execute() { }]; let to_disable = vec![new_proposal_module.address.to_string()]; - let err: ContractError = app - .execute_contract( - Addr::unchecked(CREATOR_ADDR), - start_module.address, - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { - to_add: to_add.clone(), - to_disable: to_disable.clone(), - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!( + let err = gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { + to_add: to_add.clone(), + to_disable: to_disable.clone(), + }) + .unwrap(), + } + .into()]) + .unwrap_err(); + + assert_contains( err, ContractError::ModuleDisabledCannotExecute { - address: _gov_address - } - )); + address: Addr::unchecked(""), + }, + ); // Check that the enabled query works. - let enabled_modules: Vec = app - .wrap() - .query_wasm_smart( - &gov_addr, - &QueryMsg::ActiveProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let enabled_modules = gov.active_proposal_modules(None, None).unwrap(); assert_eq!(enabled_modules, vec![new_proposal_module.clone()]); // The new proposal module should be able to perform actions. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - new_proposal_module.address, - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); + gov_mod.set_address(&new_proposal_module.address); + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { to_add, to_disable }).unwrap(), + } + .into()]) + .unwrap(); } #[test] fn test_module_already_disabled() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -712,81 +583,56 @@ fn test_module_already_disabled() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); - + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); let start_module = modules.into_iter().next().unwrap(); + gov_mod.set_address(&start_module.address); let to_disable = vec![ start_module.address.to_string(), start_module.address.to_string(), ]; - let err: ContractError = app - .execute_contract( - Addr::unchecked(CREATOR_ADDR), - start_module.address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), + let err = gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { + to_add: vec![ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateProposalModules { - to_add: vec![ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "governance module".to_string(), - }], - to_disable, - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); + label: "governance module".to_string(), + }], + to_disable, + }) + .unwrap(), + } + .into()]) + .unwrap_err(); - assert_eq!( + assert_contains( err, ContractError::ModuleAlreadyDisabled { - address: start_module.address - } - ) + address: start_module.address, + }, + ); } #[test] fn test_swap_voting_module() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -814,85 +660,51 @@ fn test_swap_voting_module() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let voting_addr: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); - + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 1); + gov_mod.set_address(&modules[0].address); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - modules[0].address.clone(), - &dao_proposal_sudo::msg::ExecuteMsg::Execute { - msgs: vec![WasmMsg::Execute { - contract_addr: gov_addr.to_string(), - funds: vec![], - msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { - module: ModuleInstantiateInfo { - code_id: govmod_id, - msg: to_json_binary(&govmod_instantiate).unwrap(), - admin: Some(Admin::CoreModule {}), - funds: vec![], - label: "voting module".to_string(), - }, - }) - .unwrap(), - } - .into()], - }, - &[], - ) - .unwrap(); + let voting_addr = gov.voting_module().unwrap(); - let new_voting_addr: Addr = app - .wrap() - .query_wasm_smart(gov_addr, &QueryMsg::VotingModule {}) + gov_mod + .proposal_execute(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + funds: vec![], + msg: to_json_binary(&ExecuteMsg::UpdateVotingModule { + module: ModuleInstantiateInfo { + code_id: govmod_id, + msg: to_json_binary(&govmod_instantiate).unwrap(), + admin: Some(Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + }, + }) + .unwrap(), + } + .into()]) .unwrap(); - assert_ne!(new_voting_addr, voting_addr); + assert_ne!(gov.voting_module().unwrap(), voting_addr); } -fn test_unauthorized(app: &mut App, gov_addr: Addr, msg: ExecuteMsg) { - let err: ContractError = app - .execute_contract(Addr::unchecked(CREATOR_ADDR), gov_addr, &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); +fn test_unauthorized(gov: &DaoDaoCore, msg: ExecuteMsg) { + let err = gov.execute(&msg, None).unwrap_err(); - assert_eq!(err, ContractError::Unauthorized {}); + assert_contains(err, ContractError::Unauthorized {}); } #[test] fn test_permissions() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -920,20 +732,10 @@ fn test_permissions() { automatically_add_cw721s: true, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); test_unauthorized( - &mut app, - gov_addr.clone(), + &gov, ExecuteMsg::UpdateVotingModule { module: ModuleInstantiateInfo { code_id: govmod_id, @@ -946,8 +748,7 @@ fn test_permissions() { ); test_unauthorized( - &mut app, - gov_addr.clone(), + &gov, ExecuteMsg::UpdateProposalModules { to_add: vec![], to_disable: vec![], @@ -955,8 +756,7 @@ fn test_permissions() { ); test_unauthorized( - &mut app, - gov_addr, + &gov, ExecuteMsg::UpdateConfig { config: Config { dao_uri: None, @@ -970,48 +770,62 @@ fn test_permissions() { ); } -fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); +fn do_standard_instantiate( + auto_add: bool, + admin: bool, +) -> ( + DaoDaoCore, + DaoProposalSudo, + MockBech32, + Option, +) { + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let mut gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + gov_mod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, }, }; + let admin = admin.then(|| mock.addr_make("admin")); let gov_instantiate = InstantiateMsg { dao_uri: None, - admin, + admin: admin.as_ref().map(|a| a.to_string()), name: "DAO DAO".to_string(), description: "A DAO that builds DAOs.".to_string(), image_url: None, automatically_add_cw20s: auto_add, automatically_add_cw721s: auto_add, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: gov_mod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -1020,653 +834,374 @@ fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); + + let proposal_modules = gov.proposal_modules(None, None).unwrap(); + assert_eq!(proposal_modules.len(), 1); + let proposal_module = proposal_modules.into_iter().next().unwrap(); + gov_mod.set_address(&proposal_module.address); + + if admin.is_none() { + gov = gov.call_as(&gov.address().unwrap()); + } - (gov_addr, app) + (gov, gov_mod, mock, admin) } #[test] fn test_admin_permissions() { - let (core_addr, mut app) = do_standard_instantiate(true, None); - - let start_height = app.block_info().height; - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let (core, proposal, mock, _) = do_standard_instantiate(true, false); - assert_eq!(proposal_modules.len(), 1); - let proposal_module = proposal_modules.into_iter().next().unwrap(); + let random = mock.addr_make("random"); + let start_height = mock.block_info().unwrap().height; // Random address can't call ExecuteAdminMsgs - let res = app.execute_contract( - Addr::unchecked("random"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core.call_as(&random) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Proposal module can't call ExecuteAdminMsgs - let res = app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core.call_as(&proposal.address().unwrap()) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Update Admin can't be called by non-admins - let res = app.execute_contract( - Addr::unchecked("rando"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("rando".to_string()), - }, - &[], - ); - res.unwrap_err(); + core.call_as(&random) + .nominate_admin(Some(random.to_string())) + .unwrap_err(); // Nominate admin can be called by core contract as no admin was // specified so the admin defaulted to the core contract. - let res = app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap(); + + core.call_as(&proposal.address().unwrap()) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // Instantiate new DAO with an admin - let (core_with_admin_addr, mut app) = - do_standard_instantiate(true, Some(Addr::unchecked("admin").to_string())); + let (core_with_admin, proposal_with_admin_address, mock, admin) = + do_standard_instantiate(true, true); + let admin = admin.unwrap(); // Non admins still can't call ExecuteAdminMsgs - let res = app.execute_contract( - proposal_module.address, - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap_err(); + core_with_admin + .call_as(&proposal_with_admin_address.address().unwrap()) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); // Admin cannot directly pause the DAO - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), - }, - &[], - ); - assert!(res.is_err()); + core_with_admin + .call_as(&admin) + .pause(Duration::Height(10)) + .unwrap_err(); // Random person cannot pause the DAO - let res = app.execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), - }, - &[], - ); - assert!(res.is_err()); + core_with_admin + .call_as(&random) + .pause(Duration::Height(10)) + .unwrap_err(); // Admin can call ExecuteAdminMsgs, here an admin pauses the DAO - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - assert!(res.is_ok()); + let _res = core_with_admin + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // Ensure we are paused for 10 blocks - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); assert_eq!( - paused, + core_with_admin.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); // DAO unpauses after 10 blocks - app.update_block(|block| block.height += 11); + mock.wait_blocks(11).unwrap(); // Check we are unpaused - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); + assert_eq!( + core_with_admin.pause_info().unwrap(), + PauseInfoResponse::Unpaused {} + ); // Admin pauses DAO again - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_with_admin_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - assert!(res.is_ok()); + let _res = core_with_admin + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core_with_admin.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap(); // DAO with admin cannot unpause itself - let res = app.execute_contract( - core_with_admin_addr.clone(), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_err()); + let _res = core_with_admin + .call_as(&core_with_admin.address().unwrap()) + .unpause() + .unwrap_err(); // Random person cannot unpause the DAO - let res = app.execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_err()); + let _res = core_with_admin.call_as(&random).unpause().unwrap_err(); // Admin can unpause the DAO directly - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::Unpause {}, - &[], - ); - assert!(res.is_ok()); + let _res = core_with_admin.call_as(&admin).unpause().unwrap(); // Check we are unpaused - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - // Admin can nominate a new admin. - let res = app.execute_contract( - Addr::unchecked("admin"), - core_with_admin_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }, - &[], + assert_eq!( + core_with_admin.pause_info().unwrap(), + PauseInfoResponse::Unpaused {} ); - res.unwrap(); - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::AdminNomination {}) + // Admin can nominate a new admin. + let new_admin = mock.addr_make("meow"); + core_with_admin + .call_as(&admin) + .nominate_admin(Some(new_admin.to_string())) .unwrap(); + assert_eq!( - nomination, + core_with_admin.admin_nomination().unwrap(), AdminNominationResponse { - nomination: Some(Addr::unchecked("meow")) + nomination: Some(new_admin.clone()) } ); // Check that admin has not yet been updated - let res: Addr = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, Addr::unchecked("admin")); + assert_eq!(core_with_admin.admin().unwrap(), admin); // Only the nominated address may accept the nomination. - let err: ContractError = app - .execute_contract( - Addr::unchecked("random"), - core_with_admin_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core_with_admin + .call_as(&random) + .accept_admin_nomination() + .unwrap_err(); + + assert_contains(err, ContractError::Unauthorized {}); // Accept the nomination. - app.execute_contract( - Addr::unchecked("meow"), - core_with_admin_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap(); + core_with_admin + .call_as(&new_admin) + .accept_admin_nomination() + .unwrap(); // Check that admin has been updated - let res: Addr = app - .wrap() - .query_wasm_smart(core_with_admin_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, Addr::unchecked("meow")); + assert_eq!(core_with_admin.admin().unwrap(), new_admin); // Check that the pending admin has been cleared. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_with_admin_addr, &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core_with_admin.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); } #[test] fn test_admin_nomination() { - let (core_addr, mut app) = do_standard_instantiate(true, Some("admin".to_string())); + let (core, _, mock, admin) = do_standard_instantiate(true, true); + let admin = admin.unwrap(); // Check that there is no pending nominations. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Nominate a new admin. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("ekez".to_string()), - }, - &[], - ) - .unwrap(); + let ekez = mock.addr_make("ekez"); + core.call_as(&admin) + .nominate_admin(Some(ekez.to_string())) + .unwrap(); // Check that the nomination is in place. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); assert_eq!( - nomination, + core.admin_nomination().unwrap(), AdminNominationResponse { - nomination: Some(Addr::unchecked("ekez")) + nomination: Some(ekez.clone()) } ); // Non-admin can not withdraw. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core.call_as(&ekez).withdraw_admin_nomination().unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); // Admin can withdraw. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap(); + core.call_as(&admin).withdraw_admin_nomination().unwrap(); // Check that the nomination is withdrawn. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Can not withdraw if no nomination is pending. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::WithdrawAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::NoAdminNomination {}); + let err = core + .call_as(&admin) + .withdraw_admin_nomination() + .unwrap_err(); + + assert_contains(err, ContractError::NoAdminNomination {}); // Can not claim nomination b/c it has been withdrawn. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::NoAdminNomination {}); + let err = core.call_as(&admin).accept_admin_nomination().unwrap_err(); + + assert_contains(err, ContractError::NoAdminNomination {}); // Nominate a new admin. - app.execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("meow".to_string()), - }, - &[], - ) - .unwrap(); + let meow = mock.addr_make("meow"); + core.call_as(&admin) + .nominate_admin(Some(meow.to_string())) + .unwrap(); // A new nomination can not be created if there is already a // pending nomination. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { - admin: Some("arthur".to_string()), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::PendingNomination {}); + let err = core + .call_as(&admin) + .nominate_admin(Some(ekez.to_string())) + .unwrap_err(); + assert_contains(err, ContractError::PendingNomination {}); // Only nominated admin may accept. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let err = core.call_as(&ekez).accept_admin_nomination().unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); - app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::AcceptAdminNomination {}, - &[], - ) - .unwrap(); + core.call_as(&meow).accept_admin_nomination().unwrap(); // Check that meow is the new admin. - let admin: Addr = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(admin, Addr::unchecked("meow".to_string())); + assert_eq!(core.admin().unwrap(), meow); - let start_height = app.block_info().height; + let start_height = mock.block_info().unwrap().height; // Check that the new admin can do admin things and the old can not. - let err: ContractError = app - .execute_contract( - Addr::unchecked("admin"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() + let err = core + .call_as(&admin) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); + + core.call_as(&meow) + .execute_admin_msgs(vec![WasmMsg::Execute { + contract_addr: core.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); - - let res = app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::ExecuteAdminMsgs { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ); - res.unwrap(); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); assert_eq!( - paused, + core.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); // DAO unpauses after 10 blocks - app.update_block(|block| block.height += 11); + mock.wait_blocks(11).unwrap(); // Remove the admin. - app.execute_contract( - Addr::unchecked("meow"), - core_addr.clone(), - &ExecuteMsg::NominateAdmin { admin: None }, - &[], - ) - .unwrap(); + core.call_as(&meow).nominate_admin(None).unwrap(); // Check that this has not caused an admin to be nominated. - let nomination: AdminNominationResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::AdminNomination {}) - .unwrap(); - assert_eq!(nomination, AdminNominationResponse { nomination: None }); + assert_eq!( + core.admin_nomination().unwrap(), + AdminNominationResponse { nomination: None } + ); // Check that admin has been updated. As there was no admin // nominated the admin should revert back to the contract address. - let res: Addr = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::Admin {}) - .unwrap(); - assert_eq!(res, core_addr); + assert_eq!(core.admin().unwrap(), core.address().unwrap()); } #[test] fn test_passthrough_voting_queries() { - let (gov_addr, app) = do_standard_instantiate(true, None); - - let creator_voting_power: VotingPowerAtHeightResponse = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::VotingPowerAtHeight { - address: CREATOR_ADDR.to_string(), - height: None, - }, - ) - .unwrap(); + let (gov, _, mock, _) = do_standard_instantiate(true, false); assert_eq!( - creator_voting_power, + gov.voting_power_at_height(mock.sender().to_string(), None) + .unwrap(), VotingPowerAtHeightResponse { power: Uint128::from(2u64), - height: app.block_info().height, + height: mock.block_info().unwrap().height, } ); } -fn set_item(app: &mut App, gov_addr: Addr, key: String, value: String) { - app.execute_contract( - gov_addr.clone(), - gov_addr, - &ExecuteMsg::SetItem { key, value }, - &[], - ) - .unwrap(); -} - -fn remove_item(app: &mut App, gov_addr: Addr, key: String) { - app.execute_contract( - gov_addr.clone(), - gov_addr, - &ExecuteMsg::RemoveItem { key }, - &[], - ) - .unwrap(); -} - -fn get_item(app: &mut App, gov_addr: Addr, key: String) -> GetItemResponse { - app.wrap() - .query_wasm_smart(gov_addr, &QueryMsg::GetItem { key }) - .unwrap() -} - -fn list_items( - app: &mut App, - gov_addr: Addr, - start_at: Option, - limit: Option, -) -> Vec<(String, String)> { - app.wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::ListItems { - start_after: start_at, - limit, - }, - ) - .unwrap() -} - #[test] fn test_item_permissions() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::SetItem { - key: "k".to_string(), - value: "v".to_string(), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); - - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr, - &ExecuteMsg::RemoveItem { - key: "k".to_string(), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Unauthorized {}); + let (gov, _, mock, _) = do_standard_instantiate(true, false); + + let ekez = mock.addr_make("ekez"); + let err = gov + .call_as(&ekez) + .set_item("k".to_string(), "v".to_string()) + .unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); + + let err = gov.call_as(&ekez).remove_item("k".to_string()).unwrap_err(); + assert_contains(err, ContractError::Unauthorized {}); } #[test] fn test_add_remove_get() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); + let (gov, _, _mock, _) = do_standard_instantiate(true, false); - let a = get_item(&mut app, gov_addr.clone(), "aaaaa".to_string()); + let a = gov.get_item("aaaaa".to_string()).unwrap(); assert_eq!(a, GetItemResponse { item: None }); - set_item( - &mut app, - gov_addr.clone(), - "aaaaakey".to_string(), - "aaaaaaddr".to_string(), - ); - let a = get_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); + gov.set_item("aaaaakey".to_string(), "aaaaaaddr".to_string()) + .unwrap(); + let a = gov.get_item("aaaaakey".to_string()).unwrap(); assert_eq!( a, GetItemResponse { @@ -1674,38 +1209,42 @@ fn test_add_remove_get() { } ); - remove_item(&mut app, gov_addr.clone(), "aaaaakey".to_string()); - let a = get_item(&mut app, gov_addr, "aaaaakey".to_string()); + gov.remove_item("aaaaakey".to_string()).unwrap(); + let a = gov.get_item("aaaaakey".to_string()).unwrap(); assert_eq!(a, GetItemResponse { item: None }); } #[test] #[should_panic(expected = "Key is missing from storage")] fn test_remove_missing_key() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - remove_item(&mut app, gov_addr, "b".to_string()) + let (gov, _, _, _) = do_standard_instantiate(true, false); + gov.remove_item("b".to_string()).unwrap(); } #[test] fn test_list_items() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); - + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1721,14 +1260,14 @@ fn test_list_items() { automatically_add_cw20s: true, automatically_add_cw721s: true, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -1737,64 +1276,41 @@ fn test_list_items() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let gov = gov.call_as(&gov.address().unwrap()); - set_item( - &mut app, - gov_addr.clone(), - "fookey".to_string(), - "fooaddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "barkey".to_string(), - "baraddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "loremkey".to_string(), - "loremaddr".to_string(), - ); - set_item( - &mut app, - gov_addr.clone(), - "ipsumkey".to_string(), - "ipsumaddr".to_string(), - ); + gov.set_item("fookey".to_string(), "fooaddr".to_string()) + .unwrap(); + gov.set_item("barkey".to_string(), "baraddr".to_string()) + .unwrap(); + gov.set_item("loremkey".to_string(), "loremaddr".to_string()) + .unwrap(); + gov.set_item("ipsumkey".to_string(), "ipsumaddr".to_string()) + .unwrap(); // Foo returned as we are only getting one item and items are in // decending order. - let first_item = list_items(&mut app, gov_addr.clone(), None, Some(1)); + let first_item = gov.list_items(Some(1), None).unwrap(); assert_eq!(first_item.len(), 1); assert_eq!( first_item[0], ("loremkey".to_string(), "loremaddr".to_string()) ); - let no_items = list_items(&mut app, gov_addr.clone(), None, Some(0)); + let no_items = gov.list_items(Some(0), None).unwrap(); assert_eq!(no_items.len(), 0); // Items are retreived in decending order so asking for foo with // no limit ought to give us the barkey k/v. this will be the last item // note: the paginate map bound is exclusive, so fookey will be starting point - let last_item = list_items(&mut app, gov_addr.clone(), Some("foo".to_string()), None); + let last_item = gov.list_items(None, Some("foo".to_string())).unwrap(); + assert_eq!(last_item.len(), 1); assert_eq!(last_item[0], ("barkey".to_string(), "baraddr".to_string())); // Items are retreived in decending order so asking for ipsum with // 4 limit ought to give us the fookey and barkey k/vs. - let after_foo_list = list_items(&mut app, gov_addr, Some("ipsum".to_string()), Some(4)); + let after_foo_list = gov.list_items(Some(4), Some("ipsum".to_string())).unwrap(); assert_eq!(after_foo_list.len(), 2); assert_eq!( after_foo_list, @@ -1807,24 +1323,29 @@ fn test_list_items() { #[test] fn test_instantiate_with_items() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1855,14 +1376,14 @@ fn test_instantiate_with_items() { automatically_add_cw20s: true, automatically_add_cw721s: true, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -1872,45 +1393,26 @@ fn test_instantiate_with_items() { }; // Ensure duplicates are dissallowed. - let err: ContractError = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!( + let err = gov.instantiate(&gov_instantiate, None, None).unwrap_err(); + assert_contains( err, ContractError::DuplicateInitialItem { - item: "item0".to_string() - } + item: "item0".to_string(), + }, ); initial_items.pop(); gov_instantiate.initial_items = Some(initial_items); - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); + let _gov_addr = gov.instantiate(&gov_instantiate, None, None).unwrap(); // Ensure initial items were added. - let items = list_items(&mut app, gov_addr.clone(), None, None); + let items = gov.list_items(None, None).unwrap(); assert_eq!(items.len(), 2); // Descending order, so item1 is first. assert_eq!(items[1].0, "item0".to_string()); - let get_item0 = get_item(&mut app, gov_addr.clone(), "item0".to_string()); + let get_item0 = gov.get_item("item0".to_string()).unwrap(); + assert_eq!( get_item0, GetItemResponse { @@ -1919,20 +1421,18 @@ fn test_instantiate_with_items() { ); assert_eq!(items[0].0, "item1".to_string()); - let item1_value = get_item(&mut app, gov_addr, "item1".to_string()).item; + let item1_value = gov.get_item("item1".to_string()).unwrap().item; assert_eq!(item1_value, Some("item1_value".to_string())) } #[test] fn test_cw20_receive_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let cw20_id = app.store_code(cw20_contract()); - let another_cw20 = app - .instantiate_contract( - cw20_id, - Addr::unchecked(CREATOR_ADDR), - &cw20_base::msg::InstantiateMsg { + let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); + let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); + another_cw20.upload().unwrap(); + another_cw20 + .instantiate( + &abstract_cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, @@ -1940,146 +1440,82 @@ fn test_cw20_receive_auto_add() { mint: None, marketing: None, }, - &[], - "another-token", + None, None, ) .unwrap(); - let voting_module: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - let gov_token: Addr = app - .wrap() - .query_wasm_smart( - voting_module, - &dao_interface::voting::Query::TokenContract {}, - ) - .unwrap(); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + voting.set_address(&gov.voting_module().unwrap()); + + let gov_token = Cw20Base::new("cw20", mock.clone()); + gov_token.set_address(&voting.token_contract().unwrap()); // Check that the balances query works with no tokens. - let cw20_balances: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20Balances { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let cw20_balances = gov.cw_20_balances(None, None).unwrap(); assert_eq!(cw20_balances, vec![]); // Send a gov token to the governance contract. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - gov_token.clone(), - &cw20::Cw20ExecuteMsg::Send { - contract: gov_addr.to_string(), - amount: Uint128::new(1), - msg: to_json_binary(&"").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![gov_token.clone()]); - - let cw20_balances: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20Balances { - start_after: None, - limit: None, - }, + gov_token + .send( + Uint128::new(1), + gov.address().unwrap().to_string(), + to_json_binary(&"").unwrap(), ) .unwrap(); + + let cw20_list = gov.cw_20_token_list(None, None).unwrap(); + assert_eq!( + cw20_list, + vec![gov_token.address().unwrap().to_string().clone()] + ); + assert_eq!( - cw20_balances, + gov.cw_20_balances(None, None).unwrap(), vec![Cw20BalanceResponse { - addr: gov_token.clone(), + addr: gov_token.address().unwrap(), balance: Uint128::new(1), }] ); // Test removing and adding some new ones. Invalid should fail. - let err: ContractError = app - .execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec!["new".to_string()], - to_remove: vec![gov_token.to_string()], - }, - &[], + let err = gov + .update_cw_20_list( + vec![mock.addr_make("new").to_string()], + vec![gov_token.address().unwrap().to_string()], ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Std(_))); + .unwrap_err(); + println!("{:?}", err); + assert_contains(&err, "key:"); + assert_contains(err, "not found"); // Test that non-DAO can not update the list. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![], - to_remove: vec![gov_token.to_string()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Unauthorized {})); - - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![another_cw20.to_string()], - to_remove: vec![gov_token.to_string()], - }, - &[], + let err = gov + .call_as(&mock.addr_make("ekez")) + .update_cw_20_list(vec![], vec![gov_token.address().unwrap().to_string()]) + .unwrap_err(); + + assert_contains(err, ContractError::Unauthorized {}); + + gov.update_cw_20_list( + vec![another_cw20.address().unwrap().to_string()], + vec![gov_token.address().unwrap().to_string()], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw20]); + let cw20_list = gov.cw_20_token_list(None, None).unwrap(); + assert_eq!(cw20_list, vec![another_cw20.address().unwrap().to_string()]); } #[test] fn test_cw20_receive_no_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(false, None); - - let cw20_id = app.store_code(cw20_contract()); - let another_cw20 = app - .instantiate_contract( - cw20_id, - Addr::unchecked(CREATOR_ADDR), - &cw20_base::msg::InstantiateMsg { + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); + + let another_cw20 = Cw20Base::new("another-cw20", mock.clone()); + another_cw20.upload().unwrap(); + another_cw20 + .instantiate( + &abstract_cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, @@ -2087,532 +1523,345 @@ fn test_cw20_receive_no_auto_add() { mint: None, marketing: None, }, - &[], - "another-token", + None, None, ) .unwrap(); - let voting_module: Addr = app - .wrap() - .query_wasm_smart(gov_addr.clone(), &QueryMsg::VotingModule {}) - .unwrap(); - let gov_token: Addr = app - .wrap() - .query_wasm_smart( - voting_module, - &dao_interface::voting::Query::TokenContract {}, - ) - .unwrap(); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + voting.set_address(&gov.voting_module().unwrap()); + + let gov_token = Cw20Base::new("cw20", mock.clone()); + gov_token.set_address(&voting.token_contract().unwrap()); // Send a gov token to the governance contract. Should not be // added becasue auto add is turned off. - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - gov_token.clone(), - &cw20::Cw20ExecuteMsg::Send { - contract: gov_addr.to_string(), - amount: Uint128::new(1), - msg: to_json_binary(&"").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, + gov_token + .send( + Uint128::new(1), + gov.address().unwrap().to_string(), + to_json_binary(&"").unwrap(), ) .unwrap(); - assert_eq!(cw20_list, Vec::::new()); - - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw20List { - to_add: vec![another_cw20.to_string(), gov_token.to_string()], - to_remove: vec!["ok to remove non existent".to_string()], - }, - &[], + + assert_eq!( + gov.cw_20_token_list(None, None).unwrap(), + Vec::::new() + ); + + gov.update_cw_20_list( + vec![ + another_cw20.address().unwrap().to_string(), + gov_token.address().unwrap().to_string(), + ], + vec![mock.addr_make("ok to remove non existent").to_string()], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw20TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw20, gov_token]); + assert_eq!( + gov.cw_20_token_list(None, None).unwrap(), + vec![ + gov_token.address().unwrap(), + another_cw20.address().unwrap(), + ] + ); } #[test] fn test_cw721_receive() { - let (gov_addr, mut app) = do_standard_instantiate(true, None); - - let cw721_id = app.store_code(cw721_contract()); + let (gov, _proposal, mock, _) = do_standard_instantiate(true, false); - let cw721_addr = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let cw721 = Cw721Base::new("cw721", mock.clone()); + cw721.upload().unwrap(); + cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", + None, None, ) .unwrap(); - let another_cw721 = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); + another_cw721.set_code_id(cw721.code_id().unwrap()); + another_cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", + None, None, ) .unwrap(); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::Mint { - token_id: "ekez".to_string(), - owner: CREATOR_ADDR.to_string(), - token_uri: None, - extension: None, - }, - &[], - ) - .unwrap(); - - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { - contract: gov_addr.to_string(), - token_id: "ekez".to_string(), - msg: to_json_binary("").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw721_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, + cw721 + .execute( + &cw721_base::msg::ExecuteMsg::, Empty>::Mint { + token_id: "ekez".to_string(), + owner: mock.sender().to_string(), + token_uri: None, + extension: None, }, + None, ) .unwrap(); - assert_eq!(cw721_list, vec![cw721_addr.clone()]); - // Try to add an invalid cw721. - let err: ContractError = app - .execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec!["new".to_string(), cw721_addr.to_string()], - to_remove: vec![cw721_addr.to_string()], + cw721 + .execute( + &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { + contract: gov.address().unwrap().to_string(), + token_id: "ekez".to_string(), + msg: to_json_binary("").unwrap(), }, - &[], + None, ) - .unwrap_err() - .downcast() .unwrap(); - assert!(matches!(err, ContractError::Std(_))); - // Test that non-DAO can not update the list. - let err: ContractError = app - .execute_contract( - Addr::unchecked("ekez"), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![], - to_remove: vec![cw721_addr.to_string()], - }, - &[], + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + vec![cw721.address().unwrap().clone()] + ); + + // Try to add an invalid cw721. + let err = gov + .update_cw_721_list( + vec![ + mock.addr_make("new").to_string(), + cw721.address().unwrap().clone().to_string(), + ], + vec![cw721.address().unwrap().clone().to_string()], ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Unauthorized {})); + .unwrap_err(); + + println!("{:?}", err); + assert_contains(&err, "key:"); + assert_contains(err, "not found"); + // assert!(matches!(err, ContractError::Std(_))); + + // Test that non-DAO can not update the list. + let err = gov + .call_as(&mock.addr_make("ekez")) + .update_cw_721_list(vec![], vec![cw721.address().unwrap().clone().to_string()]) + .unwrap_err(); + + assert_contains(err, ContractError::Unauthorized {}); // Add a real cw721. - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![another_cw721.to_string(), cw721_addr.to_string()], - to_remove: vec![cw721_addr.to_string()], - }, - &[], + gov.update_cw_721_list( + vec![ + cw721.address().unwrap().to_string(), + another_cw721.address().unwrap().to_string(), + ], + vec![cw721.address().unwrap().to_string()], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw721]); + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + vec![another_cw721.address().unwrap()] + ); } #[test] fn test_cw721_receive_no_auto_add() { - let (gov_addr, mut app) = do_standard_instantiate(false, None); - - let cw721_id = app.store_code(cw721_contract()); + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - let cw721_addr = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let cw721 = Cw721Base::new("cw721", mock.clone()); + cw721.upload().unwrap(); + cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", + None, None, ) .unwrap(); - let another_cw721 = app - .instantiate_contract( - cw721_id, - Addr::unchecked(CREATOR_ADDR), + let another_cw721 = Cw721Base::new("another_cw721", mock.clone()); + another_cw721.set_code_id(cw721.code_id().unwrap()); + another_cw721 + .instantiate( &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: CREATOR_ADDR.to_string(), + minter: mock.sender().to_string(), }, - &[], - "cw721", + None, None, ) .unwrap(); - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::Mint { - token_id: "ekez".to_string(), - owner: CREATOR_ADDR.to_string(), - token_uri: None, - extension: None, - }, - &[], - ) - .unwrap(); - - app.execute_contract( - Addr::unchecked(CREATOR_ADDR), - cw721_addr.clone(), - &cw721_base::msg::ExecuteMsg::, Empty>::SendNft { - contract: gov_addr.to_string(), - token_id: "ekez".to_string(), - msg: to_json_binary("").unwrap(), - }, - &[], - ) - .unwrap(); - - let cw721_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr.clone(), - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw721_list, Vec::::new()); + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + Vec::::new() + ); // Duplicates OK. Just adds one. - app.execute_contract( - Addr::unchecked(gov_addr.clone()), - gov_addr.clone(), - &ExecuteMsg::UpdateCw721List { - to_add: vec![ - another_cw721.to_string(), - cw721_addr.to_string(), - cw721_addr.to_string(), - ], - to_remove: vec![], - }, - &[], + gov.update_cw_721_list( + vec![ + another_cw721.address().unwrap().to_string(), + cw721.address().unwrap().to_string(), + cw721.address().unwrap().to_string(), + ], + vec![], ) .unwrap(); - let cw20_list: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::Cw721TokenList { - start_after: None, - limit: None, - }, - ) - .unwrap(); - assert_eq!(cw20_list, vec![another_cw721, cw721_addr]); + assert_eq!( + gov.cw_721_token_list(None, None).unwrap(), + vec![another_cw721.address().unwrap(), cw721.address().unwrap()] + ); } #[test] fn test_pause() { - let (core_addr, mut app) = do_standard_instantiate(false, None); + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); - let start_height = app.block_info().height; - - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let start_height = mock.block_info().unwrap().height; + let proposal_modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(proposal_modules.len(), 1); let proposal_module = proposal_modules.into_iter().next().unwrap(); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); + + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Unpaused {} + ); // DAO is not paused. Check that we can execute things. // // Tests intentionally use the core address to send these // messsages to simulate a worst case scenerio where the core // contract has a vulnerability. - app.execute_contract( - core_addr.clone(), - core_addr.clone(), - &ExecuteMsg::UpdateConfig { - config: Config { - dao_uri: None, - name: "The Empire Strikes Back".to_string(), - description: "haha lol we have pwned your DAO".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }, - }, - &[], - ) + gov.update_config(Config { + dao_uri: None, + name: "The Empire Strikes Back".to_string(), + description: "haha lol we have pwned your DAO".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }) .unwrap(); // Oh no the DAO is under attack! Quick! Pause the DAO while we // figure out what to do! - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::Pause { - duration: Duration::Height(10), - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); + let err = gov + .call_as(&proposal_module.address) + .pause(Duration::Height(10)) + .unwrap_err(); // Only the DAO may call this on itself. Proposal modules must use // the execute hook. - assert_eq!(err, ContractError::Unauthorized {}); - - app.execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap(); - - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + assert_contains(err, ContractError::Unauthorized {}); + gov.call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) .unwrap(); + assert_eq!( - paused, + gov.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); assert_eq!( - all_state.pause_info, + gov.dump_state().unwrap().pause_info, PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 10) } ); // This should actually be allowed to enable the admin to execute - let result = app.execute_contract( - core_addr.clone(), - core_addr.clone(), - &ExecuteMsg::UpdateConfig { - config: Config { - dao_uri: None, - name: "The Empire Strikes Back Again".to_string(), - description: "haha lol we have pwned your DAO again".to_string(), - image_url: None, - automatically_add_cw20s: true, - automatically_add_cw721s: true, - }, - }, - &[], - ); - assert!(result.is_ok()); - - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); + gov.update_config(Config { + dao_uri: None, + name: "The Empire Strikes Back Again".to_string(), + description: "haha lol we have pwned your DAO again".to_string(), + image_url: None, + automatically_add_cw20s: true, + automatically_add_cw721s: true, + }) + .unwrap(); + + let err = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); - assert!(matches!(err, ContractError::Paused { .. })); + assert_contains(err, ContractError::Paused {}); - app.update_block(|block| block.height += 9); + mock.wait_blocks(9).unwrap(); // Still not unpaused. - let err: ContractError = app - .execute_contract( - proposal_module.address.clone(), - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap_err() - .downcast() - .unwrap(); - assert!(matches!(err, ContractError::Paused { .. })); + let err = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) + .unwrap_err(); + + assert_contains(err, ContractError::Paused {}); - app.update_block(|block| block.height += 1); + mock.wait_blocks(1).unwrap(); - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) - .unwrap(); - assert_eq!(paused, PauseInfoResponse::Unpaused {}); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) - .unwrap(); - assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); + assert_eq!(gov.pause_info().unwrap(), PauseInfoResponse::Unpaused {}); + assert_eq!( + gov.dump_state().unwrap().pause_info, + PauseInfoResponse::Unpaused {} + ); // Now its unpaused so we should be able to pause again. - app.execute_contract( - proposal_module.address, - core_addr.clone(), - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![WasmMsg::Execute { - contract_addr: core_addr.to_string(), - msg: to_json_binary(&ExecuteMsg::Pause { - duration: Duration::Height(10), - }) - .unwrap(), - funds: vec![], - } - .into()], - }, - &[], - ) - .unwrap(); - - let paused: PauseInfoResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::PauseInfo {}) + gov.call_as(&proposal_module.address) + .execute_proposal_hook(vec![WasmMsg::Execute { + contract_addr: gov.address().unwrap().to_string(), + msg: to_json_binary(&ExecuteMsg::Pause { + duration: Duration::Height(10), + }) + .unwrap(), + funds: vec![], + } + .into()]) .unwrap(); + assert_eq!( - paused, + gov.pause_info().unwrap(), PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 20) } ); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) - .unwrap(); assert_eq!( - all_state.pause_info, + gov.dump_state().unwrap().pause_info, PauseInfoResponse::Paused { expiration: Expiration::AtHeight(start_height + 20) } @@ -2621,25 +1870,13 @@ fn test_pause() { #[test] fn test_dump_state_proposal_modules() { - let (core_addr, app) = do_standard_instantiate(false, None); - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let (gov, _proposal, _mock, _) = do_standard_instantiate(false, false); + let proposal_modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(proposal_modules.len(), 1); let proposal_module = proposal_modules.into_iter().next().unwrap(); - let all_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) - .unwrap(); + let all_state: DumpStateResponse = gov.dump_state().unwrap(); assert_eq!(all_state.pause_info, PauseInfoResponse::Unpaused {}); assert_eq!(all_state.proposal_modules.len(), 1); assert_eq!(all_state.proposal_modules[0], proposal_module); @@ -2650,24 +1887,29 @@ fn test_dump_state_proposal_modules() { // this just tests the idempotency of migrate. #[test] fn test_migrate_from_compatible() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -2684,14 +1926,14 @@ fn test_migrate_from_compatible() { automatically_add_cw20s: false, automatically_add_cw721s: false, voting_module_instantiate_info: ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&govmod_instantiate).unwrap(), admin: Some(Admin::CoreModule {}), funds: vec![], @@ -2700,37 +1942,16 @@ fn test_migrate_from_compatible() { initial_items: None, }; - let core_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - Some(CREATOR_ADDR.to_string()), - ) - .unwrap(); - - let state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr.clone(), &QueryMsg::DumpState {}) + gov.instantiate(&gov_instantiate, Some(&mock.sender()), None) .unwrap(); - app.execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: gov_id, - msg: to_json_binary(&MigrateMsg::FromCompatible {}).unwrap(), - }), - ) - .unwrap(); + let state = gov.dump_state().unwrap(); - let new_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::DumpState {}) + gov.migrate(&MigrateMsg::FromCompatible {}, gov.code_id().unwrap()) .unwrap(); + let new_state = gov.dump_state().unwrap(); + assert_eq!(new_state, state); } @@ -2738,25 +1959,31 @@ fn test_migrate_from_compatible() { fn test_migrate_from_beta() { use cw_core_v1 as v1; - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let core_id = app.store_code(cw_core_contract()); - let v1_core_id = app.store_code(v1_cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let mock = MockBech32::new("mock"); + let govmod = DaoProposalSudo::new("proposal", mock.clone()); + let voting = DaoVotingCw20Balance::new("dao-voting", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + let v1_gov = DaoDaoCoreV1::new("dao-core-v1", mock.clone()); + let cw20 = Cw20Base::new("cw20", mock.clone()); + + govmod.upload().unwrap(); + voting.upload().unwrap(); + gov.upload().unwrap(); + v1_gov.upload().unwrap(); + cw20.upload().unwrap(); let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { - code_id: cw20_id, + code_id: cw20.code_id().unwrap(), label: "DAO DAO voting".to_string(), name: "DAO DAO".to_string(), symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: CREATOR_ADDR.to_string(), + address: mock.sender().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -2772,20 +1999,20 @@ fn test_migrate_from_beta() { automatically_add_cw20s: false, automatically_add_cw721s: false, voting_module_instantiate_info: v1::msg::ModuleInstantiateInfo { - code_id: voting_id, + code_id: voting.code_id().unwrap(), msg: to_json_binary(&voting_instantiate).unwrap(), admin: v1::msg::Admin::CoreContract {}, label: "voting module".to_string(), }, proposal_modules_instantiate_info: vec![ v1::msg::ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&proposal_instantiate).unwrap(), admin: v1::msg::Admin::CoreContract {}, label: "governance module 1".to_string(), }, v1::msg::ModuleInstantiateInfo { - code_id: govmod_id, + code_id: govmod.code_id().unwrap(), msg: to_json_binary(&proposal_instantiate).unwrap(), admin: v1::msg::Admin::CoreContract {}, label: "governance module 2".to_string(), @@ -2794,35 +2021,21 @@ fn test_migrate_from_beta() { initial_items: None, }; - let core_addr = app - .instantiate_contract( - v1_core_id, - Addr::unchecked(CREATOR_ADDR), - &v1_core_instantiate, - &[], - "cw-governance", - Some(CREATOR_ADDR.to_string()), - ) + v1_gov + .instantiate(&v1_core_instantiate, Some(&mock.sender()), None) .unwrap(); - app.execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: core_id, - msg: to_json_binary(&MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }) - .unwrap(), - }), + gov.set_address(&v1_gov.address().unwrap()); + gov.migrate( + &MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }, + gov.code_id().unwrap(), ) .unwrap(); - let new_state: DumpStateResponse = app - .wrap() - .query_wasm_smart(&core_addr, &QueryMsg::DumpState {}) - .unwrap(); + let new_state = gov.dump_state().unwrap(); let proposal_modules = new_state.proposal_modules; assert_eq!(2, proposal_modules.len()); @@ -2833,23 +2046,17 @@ fn test_migrate_from_beta() { } // Check that we may not migrate more than once. - let err: ContractError = app - .execute( - Addr::unchecked(CREATOR_ADDR), - CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: core_addr.to_string(), - new_code_id: core_id, - msg: to_json_binary(&MigrateMsg::FromV1 { - dao_uri: None, - params: None, - }) - .unwrap(), - }), + let err = gov + .migrate( + &MigrateMsg::FromV1 { + dao_uri: None, + params: None, + }, + gov.code_id().unwrap(), ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::AlreadyMigrated {}) + .unwrap_err(); + + assert_contains(err, ContractError::AlreadyMigrated {}) } #[test] @@ -2920,44 +2127,34 @@ fn test_migrate_mock() { #[test] fn test_execute_stargate_msg() { - let (core_addr, mut app) = do_standard_instantiate(true, None); - let proposal_modules: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let (gov, _proposal, _mock, _) = do_standard_instantiate(true, false); + let proposal_modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(proposal_modules.len(), 1); let proposal_module = proposal_modules.into_iter().next().unwrap(); - let res = app.execute_contract( - proposal_module.address, - core_addr, - &ExecuteMsg::ExecuteProposalHook { - msgs: vec![CosmosMsg::Stargate { - type_url: "foo_type".to_string(), - value: to_json_binary("foo_bin").unwrap(), - }], - }, - &[], - ); + let res = gov + .call_as(&proposal_module.address) + .execute_proposal_hook(vec![CosmosMsg::Stargate { + type_url: "foo_type".to_string(), + value: to_json_binary("foo_bin").unwrap(), + }]); + // TODO: Once cw-multi-test supports executing stargate/ibc messages we can change this test assert assert!(res.is_err()); } #[test] fn test_module_prefixes() { - let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let mock = MockBech32::new("mock"); + let gov_mod = DaoProposalSudo::new("proposal", mock.clone()); + let gov = DaoDaoCore::new("dao-core", mock.clone()); + gov_mod.upload().unwrap(); + let govmod_id = gov_mod.code_id().unwrap(); + gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: CREATOR_ADDR.to_string(), + root: mock.sender().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -3001,28 +2198,9 @@ fn test_module_prefixes() { initial_items: None, }; - let gov_addr = app - .instantiate_contract( - gov_id, - Addr::unchecked(CREATOR_ADDR), - &gov_instantiate, - &[], - "cw-governance", - None, - ) - .unwrap(); - - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); + gov.instantiate(&gov_instantiate, None, None).unwrap(); + let modules = gov.proposal_modules(None, None).unwrap(); assert_eq!(modules.len(), 3); let module_1 = &modules[0]; @@ -3032,26 +2210,17 @@ fn test_module_prefixes() { let module_2 = &modules[1]; assert_eq!(module_2.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_2.prefix, "B"); + assert_eq!(module_2.prefix, "C"); assert_eq!(&module_2.address, &modules[1].address); let module_3 = &modules[2]; assert_eq!(module_3.status, ProposalModuleStatus::Enabled {}); - assert_eq!(module_3.prefix, "C"); + assert_eq!(module_3.prefix, "B"); assert_eq!(&module_3.address, &modules[2].address); } -fn get_active_modules(app: &App, gov_addr: Addr) -> Vec { - let modules: Vec = app - .wrap() - .query_wasm_smart( - gov_addr, - &QueryMsg::ProposalModules { - start_after: None, - limit: None, - }, - ) - .unwrap(); +fn get_active_modules(gov: &DaoDaoCore) -> Vec { + let modules = gov.proposal_modules(None, None).unwrap(); modules .into_iter() @@ -3059,19 +2228,12 @@ fn get_active_modules(app: &App, gov_addr: Addr) -> Vec { .collect() } -fn query_proposal_module_count(app: &App, core_addr: &Addr) -> ProposalModuleCountResponse { - app.wrap() - .query_wasm_smart(core_addr, &QueryMsg::ProposalModuleCount {}) - .unwrap() -} - #[test] fn test_add_remove_subdaos() { - let (core_addr, mut app) = do_standard_instantiate(false, None); + let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); test_unauthorized( - &mut app, - core_addr.clone(), + &gov.call_as(&mock.sender()), ExecuteMsg::UpdateSubDaos { to_add: vec![], to_remove: vec![], @@ -3080,89 +2242,46 @@ fn test_add_remove_subdaos() { let to_add: Vec = vec![ SubDao { - addr: "subdao001".to_string(), + addr: mock.addr_make("subdao001").to_string(), charter: None, }, SubDao { - addr: "subdao002".to_string(), + addr: mock.addr_make("subdao002").to_string(), charter: Some("cool charter bro".to_string()), }, SubDao { - addr: "subdao005".to_string(), + addr: mock.addr_make("subdao005").to_string(), charter: None, }, SubDao { - addr: "subdao007".to_string(), + addr: mock.addr_make("subdao007").to_string(), charter: None, }, ]; let to_remove: Vec = vec![]; - app.execute_contract( - Addr::unchecked(core_addr.clone()), - core_addr.clone(), - &ExecuteMsg::UpdateSubDaos { to_add, to_remove }, - &[], - ) - .unwrap(); + gov.update_sub_daos(to_add, to_remove).unwrap(); - let res: Vec = app - .wrap() - .query_wasm_smart( - core_addr.clone(), - &QueryMsg::ListSubDaos { - start_after: None, - limit: None, - }, - ) - .unwrap(); + assert_eq!(gov.list_sub_daos(None, None).unwrap().len(), 4); - assert_eq!(res.len(), 4); + let to_remove: Vec = vec![mock.addr_make("subdao005").to_string()]; - let to_remove: Vec = vec!["subdao005".to_string()]; + gov.update_sub_daos(vec![], to_remove).unwrap(); - app.execute_contract( - Addr::unchecked(core_addr.clone()), - core_addr.clone(), - &ExecuteMsg::UpdateSubDaos { - to_add: vec![], - to_remove, - }, - &[], - ) - .unwrap(); - - let res: Vec = app - .wrap() - .query_wasm_smart( - core_addr, - &QueryMsg::ListSubDaos { - start_after: None, - limit: None, - }, - ) - .unwrap(); + let res = gov.list_sub_daos(None, None).unwrap(); assert_eq!(res.len(), 3); - - let test_res: SubDao = SubDao { - addr: "subdao002".to_string(), - charter: Some("cool charter bro".to_string()), - }; - - assert_eq!(res[1], test_res); - let full_result_set: Vec = vec![ SubDao { - addr: "subdao001".to_string(), + addr: mock.addr_make("subdao001").to_string(), charter: None, }, SubDao { - addr: "subdao002".to_string(), + addr: mock.addr_make("subdao002").to_string(), charter: Some("cool charter bro".to_string()), }, SubDao { - addr: "subdao007".to_string(), + addr: mock.addr_make("subdao007").to_string(), charter: None, }, ]; @@ -3182,13 +2301,9 @@ pub fn test_migrate_update_version() { #[test] fn test_query_info() { - let (core_addr, app) = do_standard_instantiate(true, None); - let res: InfoResponse = app - .wrap() - .query_wasm_smart(core_addr, &QueryMsg::Info {}) - .unwrap(); + let (gov, _, _, _) = do_standard_instantiate(true, false); assert_eq!( - res, + gov.info().unwrap(), InfoResponse { info: ContractVersion { contract: CONTRACT_NAME.to_string(), From 7bf054c74a279100a27bf8236bffb036dbdf632c Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 09:06:45 +0000 Subject: [PATCH 07/50] Added derive fns --- Cargo.lock | 9 +++++++++ Cargo.toml | 1 + contracts/dao-dao-core/Cargo.toml | 2 +- contracts/proposal/dao-proposal-condorcet/Cargo.toml | 3 ++- contracts/proposal/dao-proposal-condorcet/src/msg.rs | 3 ++- contracts/proposal/dao-proposal-multiple/Cargo.toml | 1 + contracts/proposal/dao-proposal-multiple/src/msg.rs | 3 ++- contracts/proposal/dao-proposal-single/Cargo.toml | 1 + contracts/proposal/dao-proposal-single/src/msg.rs | 3 ++- contracts/staking/cw20-stake-external-rewards/Cargo.toml | 5 +++-- contracts/staking/cw20-stake-external-rewards/src/msg.rs | 3 ++- .../staking/cw20-stake-reward-distributor/Cargo.toml | 9 ++++++--- .../staking/cw20-stake-reward-distributor/src/msg.rs | 3 ++- contracts/staking/cw20-stake/Cargo.toml | 3 ++- contracts/staking/cw20-stake/src/msg.rs | 3 ++- contracts/test/dao-proposal-hook-counter/Cargo.toml | 2 +- contracts/test/dao-proposal-hook-counter/src/msg.rs | 3 ++- contracts/test/dao-proposal-sudo/Cargo.toml | 2 +- contracts/test/dao-test-custom-factory/Cargo.toml | 2 +- contracts/test/dao-test-custom-factory/src/msg.rs | 3 ++- contracts/test/dao-voting-cw20-balance/Cargo.toml | 4 ++-- packages/dao-interface/Cargo.toml | 2 +- packages/dao-pre-propose-base/Cargo.toml | 1 + packages/dao-pre-propose-base/src/msg.rs | 3 ++- 24 files changed, 51 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d563d2fe9..140a1414b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1772,6 +1772,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", @@ -1795,6 +1796,7 @@ dependencies = [ "cosmwasm-std", "cw-controllers 1.1.2", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1815,6 +1817,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2355,6 +2358,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2464,6 +2468,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2486,6 +2491,7 @@ dependencies = [ "cosmwasm-std", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2533,6 +2539,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2594,6 +2601,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", @@ -2675,6 +2683,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-issuer", diff --git a/Cargo.toml b/Cargo.toml index 1d98d3a94..79011d8c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,6 +80,7 @@ syn = { version = "1.0", features = ["derive"] } test-context = "0.1" thiserror = { version = "1.0" } wynd-utils = "0.4" +cw-orch = "0.22.2" # One commit ahead of version 0.3.0. Allows initialization with an # optional owner. diff --git a/contracts/dao-dao-core/Cargo.toml b/contracts/dao-dao-core/Cargo.toml index 2f25f621c..ce2f09727 100644 --- a/contracts/dao-dao-core/Cargo.toml +++ b/contracts/dao-dao-core/Cargo.toml @@ -35,7 +35,7 @@ abstract-cw-plus-interface = "2.0.1" abstract-cw20 = "2.0.0" abstract-cw20-base = "2.0.0" cw-multi-test = { workspace = true } -cw-orch = "0.22.2" +cw-orch = {workspace = true} cw20-base = { workspace = true } cw721-base = { workspace = true } dao-cw-orch = { path = "../../packages/cw-orch" } diff --git a/contracts/proposal/dao-proposal-condorcet/Cargo.toml b/contracts/proposal/dao-proposal-condorcet/Cargo.toml index a53910b27..a9326a4c6 100644 --- a/contracts/proposal/dao-proposal-condorcet/Cargo.toml +++ b/contracts/proposal/dao-proposal-condorcet/Cargo.toml @@ -1,5 +1,5 @@ [package] -name ="dao-proposal-condorcet" +name = "dao-proposal-condorcet" authors = ["ekez "] description = "A DAO DAO proposal module with ranked-choice, Condorcet voting." edition = { workspace = true } @@ -26,6 +26,7 @@ dao-voting = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } thiserror = { workspace = true } +cw-orch = { workspace = true } [dev-dependencies] cosmwasm-schema = { workspace = true } diff --git a/contracts/proposal/dao-proposal-condorcet/src/msg.rs b/contracts/proposal/dao-proposal-condorcet/src/msg.rs index ab6f5aa12..684108444 100644 --- a/contracts/proposal/dao-proposal-condorcet/src/msg.rs +++ b/contracts/proposal/dao-proposal-condorcet/src/msg.rs @@ -13,6 +13,7 @@ pub struct Choice { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { Propose { choices: Vec }, Vote { proposal_id: u32, vote: Vec }, @@ -23,7 +24,7 @@ pub enum ExecuteMsg { #[proposal_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(crate::proposal::ProposalResponse)] Proposal { id: u32 }, diff --git a/contracts/proposal/dao-proposal-multiple/Cargo.toml b/contracts/proposal/dao-proposal-multiple/Cargo.toml index 5eca7e2df..e9d1f90c2 100644 --- a/contracts/proposal/dao-proposal-multiple/Cargo.toml +++ b/contracts/proposal/dao-proposal-multiple/Cargo.toml @@ -39,6 +39,7 @@ cw-hooks = { workspace = true } dao-hooks = { workspace = true } dao-pre-propose-multiple = { workspace = true } voting-v1 = { workspace = true } +cw-orch = { workspace = true } [dev-dependencies] anyhow = { workspace = true } diff --git a/contracts/proposal/dao-proposal-multiple/src/msg.rs b/contracts/proposal/dao-proposal-multiple/src/msg.rs index 1ed54db93..071e8d802 100644 --- a/contracts/proposal/dao-proposal-multiple/src/msg.rs +++ b/contracts/proposal/dao-proposal-multiple/src/msg.rs @@ -48,6 +48,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Creates a proposal in the governance module. Propose(MultipleChoiceProposeMsg), @@ -147,7 +148,7 @@ pub enum ExecuteMsg { #[proposal_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Gets the governance module's config. #[returns(crate::state::Config)] diff --git a/contracts/proposal/dao-proposal-single/Cargo.toml b/contracts/proposal/dao-proposal-single/Cargo.toml index 06170dd00..6f694fe09 100644 --- a/contracts/proposal/dao-proposal-single/Cargo.toml +++ b/contracts/proposal/dao-proposal-single/Cargo.toml @@ -34,6 +34,7 @@ thiserror = { workspace = true } cw-utils-v1 = { workspace = true} voting-v1 = { workspace = true } cw-proposal-single-v1 = { workspace = true, features = ["library"] } +cw-orch = {workspace = true} [dev-dependencies] anyhow = { workspace = true } diff --git a/contracts/proposal/dao-proposal-single/src/msg.rs b/contracts/proposal/dao-proposal-single/src/msg.rs index 302303b48..82e75f22f 100644 --- a/contracts/proposal/dao-proposal-single/src/msg.rs +++ b/contracts/proposal/dao-proposal-single/src/msg.rs @@ -47,6 +47,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Creates a proposal in the module. Propose(SingleChoiceProposeMsg), @@ -147,7 +148,7 @@ pub enum ExecuteMsg { #[proposal_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Gets the proposal module's config. #[returns(crate::state::Config)] diff --git a/contracts/staking/cw20-stake-external-rewards/Cargo.toml b/contracts/staking/cw20-stake-external-rewards/Cargo.toml index 9f59c261e..f081eb63a 100644 --- a/contracts/staking/cw20-stake-external-rewards/Cargo.toml +++ b/contracts/staking/cw20-stake-external-rewards/Cargo.toml @@ -22,15 +22,16 @@ cw-storage-plus = { workspace = true } cw-controllers = { workspace = true } cw20 = { workspace = true } cw-utils = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true, features = ["library"] } cw2 = { workspace = true } thiserror = { workspace = true } -cw20-stake = { workspace = true, features = ["library"]} +cw20-stake = { workspace = true, features = ["library"] } cw-ownable = { workspace = true } dao-hooks = { workspace = true } cw20-stake-external-rewards-v1 = { workspace = true } cw20-013 = { package = "cw20", version = "0.13" } +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/staking/cw20-stake-external-rewards/src/msg.rs b/contracts/staking/cw20-stake-external-rewards/src/msg.rs index eb873c798..e4bc3be81 100644 --- a/contracts/staking/cw20-stake-external-rewards/src/msg.rs +++ b/contracts/staking/cw20-stake-external-rewards/src/msg.rs @@ -22,6 +22,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { StakeChangeHook(StakeChangedHookMsg), Claim {}, @@ -45,7 +46,7 @@ pub enum ReceiveMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(InfoResponse)] Info {}, diff --git a/contracts/staking/cw20-stake-reward-distributor/Cargo.toml b/contracts/staking/cw20-stake-reward-distributor/Cargo.toml index 75972d965..5ecfcd971 100644 --- a/contracts/staking/cw20-stake-reward-distributor/Cargo.toml +++ b/contracts/staking/cw20-stake-reward-distributor/Cargo.toml @@ -1,7 +1,9 @@ [package] name = "cw20-stake-reward-distributor" edition = "2018" -authors = ["Vernon Johnson , ekez "] +authors = [ + "Vernon Johnson , ekez ", +] description = "Distributes cw20 staking rewards." license = { workspace = true } repository = { workspace = true } @@ -24,11 +26,12 @@ cw-storage-plus = { workspace = true } cw2 = { workspace = true } cw20 = { workspace = true } cw-utils = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } -cw20-stake = { workspace = true, features = ["library"]} +cw20-base = { workspace = true, features = ["library"] } +cw20-stake = { workspace = true, features = ["library"] } thiserror = { workspace = true } cw-ownable = { workspace = true } cw20-stake-reward-distributor-v1 = { workspace = true, features = ["library"] } +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/staking/cw20-stake-reward-distributor/src/msg.rs b/contracts/staking/cw20-stake-reward-distributor/src/msg.rs index 47e347086..a54ca3c5f 100644 --- a/contracts/staking/cw20-stake-reward-distributor/src/msg.rs +++ b/contracts/staking/cw20-stake-reward-distributor/src/msg.rs @@ -18,6 +18,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { UpdateConfig { staking_addr: String, @@ -29,7 +30,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(InfoResponse)] Info {}, diff --git a/contracts/staking/cw20-stake/Cargo.toml b/contracts/staking/cw20-stake/Cargo.toml index 4417b372b..47cf154d0 100644 --- a/contracts/staking/cw20-stake/Cargo.toml +++ b/contracts/staking/cw20-stake/Cargo.toml @@ -23,7 +23,7 @@ cw-controllers = { workspace = true } cw-hooks = { workspace = true } cw20 = { workspace = true } cw-utils = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true, features = ["library"] } cw2 = { workspace = true } thiserror = { workspace = true } cw-paginate-storage = { workspace = true } @@ -33,6 +33,7 @@ dao-voting = { workspace = true } cw20-stake-v1 = { workspace = true, features = ["library"] } cw-utils-v1 = { workspace = true } +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/staking/cw20-stake/src/msg.rs b/contracts/staking/cw20-stake/src/msg.rs index bfe65466b..19dd36f71 100644 --- a/contracts/staking/cw20-stake/src/msg.rs +++ b/contracts/staking/cw20-stake/src/msg.rs @@ -21,6 +21,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { Receive(Cw20ReceiveMsg), Unstake { amount: Uint128 }, @@ -37,7 +38,7 @@ pub enum ReceiveMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(StakedBalanceAtHeightResponse)] StakedBalanceAtHeight { diff --git a/contracts/test/dao-proposal-hook-counter/Cargo.toml b/contracts/test/dao-proposal-hook-counter/Cargo.toml index 395fb338a..00606da08 100644 --- a/contracts/test/dao-proposal-hook-counter/Cargo.toml +++ b/contracts/test/dao-proposal-hook-counter/Cargo.toml @@ -23,7 +23,7 @@ cw-storage-plus = { workspace = true } cw2 = { workspace = true } thiserror = { workspace = true } dao-hooks = { workspace = true } - +cw-orch = { workspace = true } [dev-dependencies] cw-hooks = { workspace = true } cw20 = { workspace = true } diff --git a/contracts/test/dao-proposal-hook-counter/src/msg.rs b/contracts/test/dao-proposal-hook-counter/src/msg.rs index ad6048228..9a4a6f5e6 100644 --- a/contracts/test/dao-proposal-hook-counter/src/msg.rs +++ b/contracts/test/dao-proposal-hook-counter/src/msg.rs @@ -8,6 +8,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { ProposalHook(ProposalHookMsg), StakeChangeHook(StakeChangedHookMsg), @@ -15,7 +16,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(Uint128)] StakeCounter {}, diff --git a/contracts/test/dao-proposal-sudo/Cargo.toml b/contracts/test/dao-proposal-sudo/Cargo.toml index 87f102efc..cb4fa9f46 100644 --- a/contracts/test/dao-proposal-sudo/Cargo.toml +++ b/contracts/test/dao-proposal-sudo/Cargo.toml @@ -24,7 +24,7 @@ cw2 = { workspace = true } thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } -cw-orch = "0.22.2" +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/test/dao-test-custom-factory/Cargo.toml b/contracts/test/dao-test-custom-factory/Cargo.toml index 1c7a8cb5c..e25fe5a54 100644 --- a/contracts/test/dao-test-custom-factory/Cargo.toml +++ b/contracts/test/dao-test-custom-factory/Cargo.toml @@ -33,6 +33,6 @@ cw-tokenfactory-issuer = { workspace = true, features = [ "library", "osmosis_tokenfactory", ] } - +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/test/dao-test-custom-factory/src/msg.rs b/contracts/test/dao-test-custom-factory/src/msg.rs index 42128cd2e..7e875d0d8 100644 --- a/contracts/test/dao-test-custom-factory/src/msg.rs +++ b/contracts/test/dao-test-custom-factory/src/msg.rs @@ -7,6 +7,7 @@ use dao_interface::token::NewTokenInfo; pub struct InstantiateMsg {} #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Example NFT factory implementation NftFactory { @@ -37,7 +38,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(dao_interface::voting::InfoResponse)] Info {}, diff --git a/contracts/test/dao-voting-cw20-balance/Cargo.toml b/contracts/test/dao-voting-cw20-balance/Cargo.toml index 77e55bf88..f750ba315 100644 --- a/contracts/test/dao-voting-cw20-balance/Cargo.toml +++ b/contracts/test/dao-voting-cw20-balance/Cargo.toml @@ -26,8 +26,8 @@ cw-utils = { workspace = true } thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } -cw-orch = "0.22.2" +cw20-base = { workspace = true, features = ["library"] } +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/packages/dao-interface/Cargo.toml b/packages/dao-interface/Cargo.toml index 62252d894..6cf745ab2 100644 --- a/packages/dao-interface/Cargo.toml +++ b/packages/dao-interface/Cargo.toml @@ -15,7 +15,7 @@ cw20 = { workspace = true } cw721 = { workspace = true } cw-utils = { workspace = true } osmosis-std = { workspace = true } -cw-orch = "0.22.2" +cw-orch = {workspace = true} [dev-dependencies] cosmwasm-schema = { workspace = true } diff --git a/packages/dao-pre-propose-base/Cargo.toml b/packages/dao-pre-propose-base/Cargo.toml index 53beba053..f8f9e392f 100644 --- a/packages/dao-pre-propose-base/Cargo.toml +++ b/packages/dao-pre-propose-base/Cargo.toml @@ -34,6 +34,7 @@ semver = { workspace = true } cw-denom-v241 = { workspace = true } dao-pre-propose-base-v241 = { workspace = true } dao-voting-v241 = { workspace = true } +cw-orch = {workspace = true} [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/packages/dao-pre-propose-base/src/msg.rs b/packages/dao-pre-propose-base/src/msg.rs index 45dfe412d..cfdd8ea64 100644 --- a/packages/dao-pre-propose-base/src/msg.rs +++ b/packages/dao-pre-propose-base/src/msg.rs @@ -20,6 +20,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Creates a new proposal in the pre-propose module. MSG will be /// serialized and used as the proposal creation message. @@ -106,7 +107,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg where QueryExt: JsonSchema, From 1cce2eafe8e1d28f5bca7e8f50ea9f813722b6c7 Mon Sep 17 00:00:00 2001 From: Kayanski Date: Fri, 17 May 2024 09:09:32 +0000 Subject: [PATCH 08/50] Added other derives --- Cargo.lock | 5 +++++ contracts/voting/dao-voting-cw20-staked/Cargo.toml | 1 + contracts/voting/dao-voting-cw20-staked/src/msg.rs | 3 ++- contracts/voting/dao-voting-cw4/Cargo.toml | 1 + contracts/voting/dao-voting-cw4/src/msg.rs | 3 ++- contracts/voting/dao-voting-cw721-roles/Cargo.toml | 1 + contracts/voting/dao-voting-cw721-roles/src/msg.rs | 3 ++- contracts/voting/dao-voting-cw721-staked/Cargo.toml | 1 + contracts/voting/dao-voting-cw721-staked/src/msg.rs | 3 ++- contracts/voting/dao-voting-token-staked/Cargo.toml | 1 + contracts/voting/dao-voting-token-staked/src/msg.rs | 3 ++- 11 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 140a1414b..fdca8c392 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2812,6 +2812,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2849,6 +2850,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2867,6 +2869,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2893,6 +2896,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2953,6 +2957,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-issuer", diff --git a/contracts/voting/dao-voting-cw20-staked/Cargo.toml b/contracts/voting/dao-voting-cw20-staked/Cargo.toml index 4eae84a64..6a9863868 100644 --- a/contracts/voting/dao-voting-cw20-staked/Cargo.toml +++ b/contracts/voting/dao-voting-cw20-staked/Cargo.toml @@ -29,6 +29,7 @@ thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } dao-voting = { workspace = true } +cw-orch.workspace = true [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/voting/dao-voting-cw20-staked/src/msg.rs b/contracts/voting/dao-voting-cw20-staked/src/msg.rs index bdb5e9f2a..0031d0deb 100644 --- a/contracts/voting/dao-voting-cw20-staked/src/msg.rs +++ b/contracts/voting/dao-voting-cw20-staked/src/msg.rs @@ -61,6 +61,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Sets the active threshold to a new value. Only the /// instantiator this contract (a DAO most likely) may call this @@ -74,7 +75,7 @@ pub enum ExecuteMsg { #[cw20_token_query] #[active_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Gets the address of the cw20-stake contract this voting module /// is wrapping. diff --git a/contracts/voting/dao-voting-cw4/Cargo.toml b/contracts/voting/dao-voting-cw4/Cargo.toml index 55c671560..6ad83eeb7 100644 --- a/contracts/voting/dao-voting-cw4/Cargo.toml +++ b/contracts/voting/dao-voting-cw4/Cargo.toml @@ -27,6 +27,7 @@ dao-dao-macros = { workspace = true } dao-interface = { workspace = true } cw4 = { workspace = true } cw4-group = { workspace = true } +cw-orch.workspace = true [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/voting/dao-voting-cw4/src/msg.rs b/contracts/voting/dao-voting-cw4/src/msg.rs index 24bd0eebc..8ae8cc6b9 100644 --- a/contracts/voting/dao-voting-cw4/src/msg.rs +++ b/contracts/voting/dao-voting-cw4/src/msg.rs @@ -18,11 +18,12 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg {} #[voting_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(cosmwasm_std::Addr)] GroupContract {}, diff --git a/contracts/voting/dao-voting-cw721-roles/Cargo.toml b/contracts/voting/dao-voting-cw721-roles/Cargo.toml index e816d763c..3ad3128ea 100644 --- a/contracts/voting/dao-voting-cw721-roles/Cargo.toml +++ b/contracts/voting/dao-voting-cw721-roles/Cargo.toml @@ -29,6 +29,7 @@ cw-utils = { workspace = true } cw2 = { workspace = true } cw4 = { workspace = true } thiserror = { workspace = true } +cw-orch.workspace = true [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/voting/dao-voting-cw721-roles/src/msg.rs b/contracts/voting/dao-voting-cw721-roles/src/msg.rs index b15099529..3a2314adf 100644 --- a/contracts/voting/dao-voting-cw721-roles/src/msg.rs +++ b/contracts/voting/dao-voting-cw721-roles/src/msg.rs @@ -44,11 +44,12 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg {} #[voting_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(crate::state::Config)] Config {}, diff --git a/contracts/voting/dao-voting-cw721-staked/Cargo.toml b/contracts/voting/dao-voting-cw721-staked/Cargo.toml index af7d5532e..edb6f2a9f 100644 --- a/contracts/voting/dao-voting-cw721-staked/Cargo.toml +++ b/contracts/voting/dao-voting-cw721-staked/Cargo.toml @@ -38,6 +38,7 @@ dao-hooks = { workspace = true } dao-interface = { workspace = true } dao-voting = { workspace = true } thiserror = { workspace = true } +cw-orch.workspace = true [dev-dependencies] anyhow = { workspace = true } diff --git a/contracts/voting/dao-voting-cw721-staked/src/msg.rs b/contracts/voting/dao-voting-cw721-staked/src/msg.rs index 837851ed3..d318ddb48 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/msg.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/msg.rs @@ -45,6 +45,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Used to stake NFTs. To stake a NFT send a cw721 send message /// to this contract with the NFT you would like to stake. The @@ -75,7 +76,7 @@ pub enum ExecuteMsg { #[active_query] #[voting_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(crate::state::Config)] Config {}, diff --git a/contracts/voting/dao-voting-token-staked/Cargo.toml b/contracts/voting/dao-voting-token-staked/Cargo.toml index 4fdee5206..7f3c9d57f 100644 --- a/contracts/voting/dao-voting-token-staked/Cargo.toml +++ b/contracts/voting/dao-voting-token-staked/Cargo.toml @@ -48,6 +48,7 @@ dao-voting = { workspace = true } cw-tokenfactory-issuer = { workspace = true, default-features = false, features = [ "library", ] } +cw-orch.workspace = true [dev-dependencies] anyhow = { workspace = true } diff --git a/contracts/voting/dao-voting-token-staked/src/msg.rs b/contracts/voting/dao-voting-token-staked/src/msg.rs index 98809ec9e..6a71bcaf1 100644 --- a/contracts/voting/dao-voting-token-staked/src/msg.rs +++ b/contracts/voting/dao-voting-token-staked/src/msg.rs @@ -36,6 +36,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Stakes tokens with the contract to get voting power in the DAO Stake {}, @@ -61,7 +62,7 @@ pub enum ExecuteMsg { #[active_query] #[voting_module_query] #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(crate::state::Config)] GetConfig {}, From 2c4db48387e961f55d7380c6556a99852e000e93 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Wed, 10 Jul 2024 23:47:40 -0500 Subject: [PATCH 09/50] Fix lints Also updates just lint to match basic.yml --- justfile | 3 ++- packages/cw-orch/src/tests.rs | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index 59bcd434e..6c35ca169 100644 --- a/justfile +++ b/justfile @@ -9,7 +9,8 @@ test: cargo test lint: - cargo +nightly clippy --all-targets -- -D warnings + cargo +stable fmt --all -- --check + cargo +stable clippy --all-targets -- -D warnings gen: build gen-schema diff --git a/packages/cw-orch/src/tests.rs b/packages/cw-orch/src/tests.rs index 82d254fb2..c3636e190 100644 --- a/packages/cw-orch/src/tests.rs +++ b/packages/cw-orch/src/tests.rs @@ -7,11 +7,11 @@ use cw_orch::{ }; use crate::{ - Cw20Stake, Cw20StakeExternalRewards, Cw20StakeRewardDistributor, DaoDaoCore,DaoVotingCw20Balance, + Cw20Stake, Cw20StakeExternalRewards, Cw20StakeRewardDistributor, DaoDaoCore, DaoPreProposeApprovalSingle, DaoPreProposeApprover, DaoPreProposeMultiple, DaoPreProposeSingle, DaoProposalCondorcet, DaoProposalHookCounter, DaoProposalMultiple, DaoProposalSingle, - DaoProposalSudo, DaoTestCustomFactory, DaoVotingCw20Staked, DaoVotingCw4, DaoVotingCw721Roles, - DaoVotingCw721Staked, DaoVotingTokenStaked, + DaoProposalSudo, DaoTestCustomFactory, DaoVotingCw20Balance, DaoVotingCw20Staked, DaoVotingCw4, + DaoVotingCw721Roles, DaoVotingCw721Staked, DaoVotingTokenStaked, }; pub const DUMMY_CHAIN_INFO: ChainInfo = ChainInfo { From 3ff1cc7b894d05f2f4b8e93b9ed4a0aae72cf670 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Wed, 10 Jul 2024 23:47:50 -0500 Subject: [PATCH 10/50] Add cache to basic.yml --- .github/workflows/basic.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 56580ba10..9ee97bef6 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -20,6 +20,17 @@ jobs: target: wasm32-unknown-unknown override: true + - name: Rust Dependencies Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + artifacts/ + key: ${{ runner.os }}-cargo-with-artifacts-${{ hashFiles('**/Cargo.lock') }} + - name: Run tests uses: actions-rs/cargo@v1 with: @@ -53,6 +64,17 @@ jobs: override: true components: rustfmt, clippy + - name: Rust Dependencies Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + artifacts/ + key: ${{ runner.os }}-cargo-with-artifacts-${{ hashFiles('**/Cargo.lock') }} + - name: Run cargo fmt uses: actions-rs/cargo@v1 with: From 5ccaa5ebc8dc65b60682782b8f34c45da6eee13a Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Thu, 11 Jul 2024 00:40:32 -0500 Subject: [PATCH 11/50] Fix cargo stuff --- contracts/dao-dao-core/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/dao-dao-core/Cargo.toml b/contracts/dao-dao-core/Cargo.toml index ce2f09727..7e51b54e2 100644 --- a/contracts/dao-dao-core/Cargo.toml +++ b/contracts/dao-dao-core/Cargo.toml @@ -35,7 +35,7 @@ abstract-cw-plus-interface = "2.0.1" abstract-cw20 = "2.0.0" abstract-cw20-base = "2.0.0" cw-multi-test = { workspace = true } -cw-orch = {workspace = true} +cw-orch = { workspace = true } cw20-base = { workspace = true } cw721-base = { workspace = true } dao-cw-orch = { path = "../../packages/cw-orch" } From 449e481d69fd25bf7fa83c451359310ac04d5812 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Thu, 11 Jul 2024 02:21:52 -0500 Subject: [PATCH 12/50] Cargo schema + fix orch wasm build and tests --- .../dao-dao-core/schema/dao-dao-core.json | 198 +++++++++++++++--- .../dao-pre-propose-approval-single.json | 25 +++ .../schema/dao-pre-propose-multiple.json | 25 +++ .../schema/dao-pre-propose-single.json | 25 +++ .../schema/dao-proposal-condorcet.json | 50 +++++ .../schema/dao-proposal-multiple.json | 100 +++++++++ .../schema/dao-proposal-single.json | 100 +++++++++ packages/cw-orch/Cargo.toml | 4 + packages/cw-orch/src/core.rs | 5 +- packages/cw-orch/src/lib.rs | 1 + .../src/pre_propose/approval_single.rs | 5 +- packages/cw-orch/src/pre_propose/approver.rs | 5 +- packages/cw-orch/src/pre_propose/multiple.rs | 5 +- packages/cw-orch/src/pre_propose/single.rs | 5 +- packages/cw-orch/src/proposal/condorcet.rs | 5 +- packages/cw-orch/src/proposal/multiple.rs | 5 +- packages/cw-orch/src/proposal/single.rs | 5 +- packages/cw-orch/src/staking/cw20_stake.rs | 5 +- .../cw-orch/src/staking/external_rewards.rs | 5 +- .../cw-orch/src/staking/reward_distributor.rs | 5 +- packages/cw-orch/src/test_contracts/cw721.rs | 3 + packages/cw-orch/src/test_contracts/mod.rs | 1 + .../test_contracts/proposal_hook_counter.rs | 5 +- .../src/test_contracts/proposal_sudo.rs | 5 +- .../src/test_contracts/test_custom_factory.rs | 5 +- .../src/test_contracts/voting_cw20_balance.rs | 5 +- packages/cw-orch/src/voting/cw20_staked.rs | 5 +- packages/cw-orch/src/voting/cw4.rs | 5 +- packages/cw-orch/src/voting/cw721_roles.rs | 5 +- packages/cw-orch/src/voting/cw721_staked.rs | 5 +- packages/cw-orch/src/voting/token_staked.rs | 5 +- 31 files changed, 585 insertions(+), 47 deletions(-) diff --git a/contracts/dao-dao-core/schema/dao-dao-core.json b/contracts/dao-dao-core/schema/dao-dao-core.json index b1cca4f3d..23e45fd01 100644 --- a/contracts/dao-dao-core/schema/dao-dao-core.json +++ b/contracts/dao-dao-core/schema/dao-dao-core.json @@ -918,6 +918,10 @@ }, "additionalProperties": false }, + "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" + }, "DistributionMsg": { "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", "oneOf": [ @@ -964,6 +968,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -1039,6 +1068,36 @@ } }, "additionalProperties": false + }, + { + "description": "This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote_weighted" + ], + "properties": { + "vote_weighted": { + "type": "object", + "required": [ + "options", + "proposal_id" + ], + "properties": { + "options": { + "type": "array", + "items": { + "$ref": "#/definitions/WeightedVoteOption" + } + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] }, @@ -1463,6 +1522,60 @@ }, "additionalProperties": false }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code using a predictable address derivation algorithm implemented in [`cosmwasm_std::instantiate2_address`].\n\nThis is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). `sender` is automatically filled with the current contract's address. `fix_msg` is automatically set to false.", + "type": "object", + "required": [ + "instantiate2" + ], + "properties": { + "instantiate2": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg", + "salt" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "salt": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, { "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", "type": "object", @@ -1547,6 +1660,21 @@ "additionalProperties": false } ] + }, + "WeightedVoteOption": { + "type": "object", + "required": [ + "option", + "weight" + ], + "properties": { + "option": { + "$ref": "#/definitions/VoteOption" + }, + "weight": { + "$ref": "#/definitions/Decimal" + } + } } } }, @@ -2486,37 +2614,43 @@ }, "cw20_balances": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Cw20BalanceResponse", - "description": "Returned by the `Cw20Balances` query.", - "type": "object", - "required": [ - "addr", - "balance" - ], - "properties": { - "addr": { - "description": "The address of the token.", - "allOf": [ - { - "$ref": "#/definitions/Addr" - } - ] - }, - "balance": { - "description": "The contract's balance.", - "allOf": [ - { - "$ref": "#/definitions/Uint128" - } - ] - } + "title": "Array_of_Cw20BalanceResponse", + "type": "array", + "items": { + "$ref": "#/definitions/Cw20BalanceResponse" }, - "additionalProperties": false, "definitions": { "Addr": { "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", "type": "string" }, + "Cw20BalanceResponse": { + "description": "Returned by the `Cw20Balances` query.", + "type": "object", + "required": [ + "addr", + "balance" + ], + "properties": { + "addr": { + "description": "The address of the token.", + "allOf": [ + { + "$ref": "#/definitions/Addr" + } + ] + }, + "balance": { + "description": "The contract's balance.", + "allOf": [ + { + "$ref": "#/definitions/Uint128" + } + ] + } + }, + "additionalProperties": false + }, "Uint128": { "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" @@ -2895,10 +3029,20 @@ }, "list_items": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Array_of_String", + "title": "Array_of_Tuple_of_String_and_String", "type": "array", "items": { - "type": "string" + "type": "array", + "items": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "maxItems": 2, + "minItems": 2 } }, "list_sub_daos": { diff --git a/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json b/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json index 25303c6bd..9bb6f1213 100644 --- a/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json +++ b/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json @@ -848,6 +848,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json b/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json index a23f2cc06..7e2958b4d 100644 --- a/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json +++ b/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json @@ -840,6 +840,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json b/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json index d91d61190..6de3d4a04 100644 --- a/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json +++ b/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json @@ -840,6 +840,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json b/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json index 31094252c..73bc73dd9 100644 --- a/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json +++ b/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json @@ -480,6 +480,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -1707,6 +1732,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json b/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json index 75729fda4..51bc3ffa2 100644 --- a/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json +++ b/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json @@ -988,6 +988,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -3097,6 +3122,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -4485,6 +4535,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -5831,6 +5906,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json b/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json index 9738cadec..fdd578d12 100644 --- a/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json +++ b/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json @@ -1041,6 +1041,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -3203,6 +3228,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -4602,6 +4652,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, @@ -5947,6 +6022,31 @@ } }, "additionalProperties": false + }, + { + "description": "This is translated to a [[MsgFundCommunityPool](https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto#LL69C1-L76C2). `depositor` is automatically filled with the current contract's address.", + "type": "object", + "required": [ + "fund_community_pool" + ], + "properties": { + "fund_community_pool": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "description": "The amount to spend", + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + } + } + }, + "additionalProperties": false } ] }, diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index 5b637879e..e4d3826e2 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -7,6 +7,10 @@ version.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = [] +wasm_test = [] + [dependencies] cosmwasm-std.workspace = true cw-orch = { version = "0.22.2" } diff --git a/packages/cw-orch/src/core.rs b/packages/cw-orch/src/core.rs index 501d56f4e..ff7fd24ea 100644 --- a/packages/cw-orch/src/core.rs +++ b/packages/cw-orch/src/core.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_dao_core::contract::{execute, instantiate, migrate, query, reply}; use dao_interface::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_interface::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoDaoCore; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoDaoCore { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/lib.rs b/packages/cw-orch/src/lib.rs index 9d99e4775..3b933d3b6 100644 --- a/packages/cw-orch/src/lib.rs +++ b/packages/cw-orch/src/lib.rs @@ -12,5 +12,6 @@ pub use staking::*; pub use test_contracts::*; pub use voting::*; +#[cfg(feature = "wasm_test")] #[cfg(test)] pub mod tests; diff --git a/packages/cw-orch/src/pre_propose/approval_single.rs b/packages/cw-orch/src/pre_propose/approval_single.rs index 98b9927f6..6dffb7e26 100644 --- a/packages/cw-orch/src/pre_propose/approval_single.rs +++ b/packages/cw-orch/src/pre_propose/approval_single.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_pre_propose_approval_single::contract::{execute, instantiate, query}; use dao_pre_propose_approval_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_pre_propose_approval_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg} #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeApprovalSingle; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeApprovalSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/approver.rs b/packages/cw-orch/src/pre_propose/approver.rs index cebd7c13a..85db3924d 100644 --- a/packages/cw-orch/src/pre_propose/approver.rs +++ b/packages/cw-orch/src/pre_propose/approver.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_pre_propose_approver::contract::{execute, instantiate, query}; use dao_pre_propose_approver::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_pre_propose_approver::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeApprover; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeApprover { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/multiple.rs b/packages/cw-orch/src/pre_propose/multiple.rs index 7517df320..4c5cafdb4 100644 --- a/packages/cw-orch/src/pre_propose/multiple.rs +++ b/packages/cw-orch/src/pre_propose/multiple.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_pre_propose_multiple::contract::{execute, instantiate, query}; use dao_pre_propose_multiple::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_pre_propose_multiple::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeMultiple; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeMultiple { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/single.rs b/packages/cw-orch/src/pre_propose/single.rs index 891654455..5934c3e45 100644 --- a/packages/cw-orch/src/pre_propose/single.rs +++ b/packages/cw-orch/src/pre_propose/single.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_pre_propose_single::contract::{execute, instantiate, query}; use dao_pre_propose_single::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_pre_propose_single::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeSingle; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/condorcet.rs b/packages/cw-orch/src/proposal/condorcet.rs index fdfb8fb50..5bfce3f22 100644 --- a/packages/cw-orch/src/proposal/condorcet.rs +++ b/packages/cw-orch/src/proposal/condorcet.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_proposal_condorcet::contract::{execute, instantiate, query, reply}; use dao_proposal_condorcet::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_proposal_condorcet::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalCondorcet; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalCondorcet { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/multiple.rs b/packages/cw-orch/src/proposal/multiple.rs index dc28e8ef0..d5d482ae6 100644 --- a/packages/cw-orch/src/proposal/multiple.rs +++ b/packages/cw-orch/src/proposal/multiple.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_proposal_multiple::contract::{execute, instantiate, migrate, query, reply}; use dao_proposal_multiple::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_proposal_multiple::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMs #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoProposalMultiple; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalMultiple { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/single.rs b/packages/cw-orch/src/proposal/single.rs index 7db09ee3b..c84617f21 100644 --- a/packages/cw-orch/src/proposal/single.rs +++ b/packages/cw-orch/src/proposal/single.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_proposal_single::contract::{execute, instantiate, migrate, query, reply}; use dao_proposal_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_proposal_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg} #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoProposalSingle; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/cw20_stake.rs b/packages/cw-orch/src/staking/cw20_stake.rs index 8b43d844c..bfbfeb054 100644 --- a/packages/cw-orch/src/staking/cw20_stake.rs +++ b/packages/cw-orch/src/staking/cw20_stake.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use cw20_stake::contract::{execute, instantiate, migrate, query}; use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20Stake; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20Stake { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/external_rewards.rs b/packages/cw-orch/src/staking/external_rewards.rs index 0d4f19c5c..919b66b3d 100644 --- a/packages/cw-orch/src/staking/external_rewards.rs +++ b/packages/cw-orch/src/staking/external_rewards.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use cw20_stake_external_rewards::contract::{execute, instantiate, migrate, query}; use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Q #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20StakeExternalRewards; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20StakeExternalRewards { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/reward_distributor.rs b/packages/cw-orch/src/staking/reward_distributor.rs index 2f398ca81..cc6e4f7a8 100644 --- a/packages/cw-orch/src/staking/reward_distributor.rs +++ b/packages/cw-orch/src/staking/reward_distributor.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use cw20_stake_reward_distributor::contract::{execute, instantiate, migrate, query}; use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20StakeRewardDistributor; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20StakeRewardDistributor { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/cw721.rs b/packages/cw-orch/src/test_contracts/cw721.rs index 2bd6fc9cd..2959d2090 100644 --- a/packages/cw-orch/src/test_contracts/cw721.rs +++ b/packages/cw-orch/src/test_contracts/cw721.rs @@ -4,12 +4,14 @@ use cw721_base::{ ExecuteMsg, InstantiateMsg, QueryMsg, }; use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] use cw_orch::prelude::*; pub type Cw721BaseQueryMsg = QueryMsg; #[interface(InstantiateMsg, ExecuteMsg, Cw721BaseQueryMsg, Empty)] pub struct Cw721BaseGeneric; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw721BaseGeneric { // Return a CosmWasm contract wrapper fn wrapper() -> Box> { @@ -17,4 +19,5 @@ impl Uploadable for Cw721BaseGeneric { } } +#[cfg(not(target_arch = "wasm32"))] pub type Cw721Base = Cw721BaseGeneric, Empty>; diff --git a/packages/cw-orch/src/test_contracts/mod.rs b/packages/cw-orch/src/test_contracts/mod.rs index 674ad6cc6..fb92c9f7c 100644 --- a/packages/cw-orch/src/test_contracts/mod.rs +++ b/packages/cw-orch/src/test_contracts/mod.rs @@ -4,6 +4,7 @@ mod proposal_sudo; mod test_custom_factory; mod voting_cw20_balance; +#[cfg(not(target_arch = "wasm32"))] pub use cw721::Cw721Base; pub use proposal_hook_counter::DaoProposalHookCounter; pub use proposal_sudo::DaoProposalSudo; diff --git a/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs index 7dc26654e..5702cf132 100644 --- a/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs +++ b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_proposal_hook_counter::contract::{execute, instantiate, query}; use dao_proposal_hook_counter::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_proposal_hook_counter::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalHookCounter; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalHookCounter { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/proposal_sudo.rs b/packages/cw-orch/src/test_contracts/proposal_sudo.rs index bd623624a..27ba05201 100644 --- a/packages/cw-orch/src/test_contracts/proposal_sudo.rs +++ b/packages/cw-orch/src/test_contracts/proposal_sudo.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_proposal_sudo::contract::{execute, instantiate, query}; use dao_proposal_sudo::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_proposal_sudo::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalSudo; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalSudo { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/test_custom_factory.rs b/packages/cw-orch/src/test_contracts/test_custom_factory.rs index 3424df887..e6dd8e963 100644 --- a/packages/cw-orch/src/test_contracts/test_custom_factory.rs +++ b/packages/cw-orch/src/test_contracts/test_custom_factory.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_test_custom_factory::contract::{execute, instantiate, query, reply}; use dao_test_custom_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_test_custom_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoTestCustomFactory; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoTestCustomFactory { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs index fdf7b84c0..15b8c2cb3 100644 --- a/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs +++ b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_cw20_balance::contract::{execute, instantiate, query, reply}; use dao_voting_cw20_balance::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_cw20_balance::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoVotingCw20Balance; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw20Balance { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw20_staked.rs b/packages/cw-orch/src/voting/cw20_staked.rs index 1f044a913..33ee57ed3 100644 --- a/packages/cw-orch/src/voting/cw20_staked.rs +++ b/packages/cw-orch/src/voting/cw20_staked.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_cw20_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw20_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_cw20_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryM #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw20Staked; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw20Staked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw4.rs b/packages/cw-orch/src/voting/cw4.rs index 11dfac5ea..d230cd5a1 100644 --- a/packages/cw-orch/src/voting/cw4.rs +++ b/packages/cw-orch/src/voting/cw4.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_cw4::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw4::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_cw4::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw4; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw4 { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw721_roles.rs b/packages/cw-orch/src/voting/cw721_roles.rs index 6469a0887..395d3b0ed 100644 --- a/packages/cw-orch/src/voting/cw721_roles.rs +++ b/packages/cw-orch/src/voting/cw721_roles.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_cw721_roles::contract::{execute, instantiate, query, reply}; use dao_voting_cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoVotingCw721Roles; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw721Roles { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw721_staked.rs b/packages/cw-orch/src/voting/cw721_staked.rs index 5ed2f1ce1..e5b4bb02d 100644 --- a/packages/cw-orch/src/voting/cw721_staked.rs +++ b/packages/cw-orch/src/voting/cw721_staked.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_cw721_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw721_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_cw721_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Query #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw721Staked; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw721Staked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/token_staked.rs b/packages/cw-orch/src/voting/token_staked.rs index a8f41ca94..733e00260 100644 --- a/packages/cw-orch/src/voting/token_staked.rs +++ b/packages/cw-orch/src/voting/token_staked.rs @@ -1,4 +1,6 @@ -use cw_orch::{interface, prelude::*}; +use cw_orch::interface; +#[cfg(not(target_arch = "wasm32"))] +use cw_orch::prelude::*; use dao_voting_token_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_token_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -6,6 +8,7 @@ use dao_voting_token_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Query #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingTokenStaked; +#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingTokenStaked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { From 485b7f79582a8a76ae13533544cffb0ed6a75c3b Mon Sep 17 00:00:00 2001 From: hard-nett Date: Sat, 13 Jul 2024 18:53:38 +0000 Subject: [PATCH 13/50] add cw-orch to external contract --- Cargo.lock | 15 ++++++++++++ .../external/cw-admin-factory/Cargo.toml | 1 + .../external/cw-admin-factory/src/msg.rs | 3 ++- .../external/cw-payroll-factory/Cargo.toml | 1 + .../external/cw-payroll-factory/src/msg.rs | 3 ++- contracts/external/cw-token-swap/Cargo.toml | 1 + contracts/external/cw-token-swap/src/msg.rs | 3 ++- .../cw-tokenfactory-issuer/Cargo.toml | 1 + .../cw-tokenfactory-issuer/src/msg.rs | 3 ++- contracts/external/cw-vesting/Cargo.toml | 1 + contracts/external/cw-vesting/src/msg.rs | 3 ++- contracts/external/cw721-roles/Cargo.toml | 1 + contracts/external/dao-migrator/Cargo.toml | 1 + packages/cw-orch/Cargo.toml | 7 ++++++ .../cw-orch/src/external/admin_factory.rs | 20 ++++++++++++++++ packages/cw-orch/src/external/cw721_roles.rs | 20 ++++++++++++++++ packages/cw-orch/src/external/cw_vesting.rs | 20 ++++++++++++++++ packages/cw-orch/src/external/migrator.rs | 20 ++++++++++++++++ packages/cw-orch/src/external/mod.rs | 15 ++++++++++++ .../cw-orch/src/external/payroll_factory.rs | 20 ++++++++++++++++ packages/cw-orch/src/external/token_swap.rs | 21 ++++++++++++++++ .../src/external/tokenfactory_issuer.rs | 24 +++++++++++++++++++ packages/cw-orch/src/lib.rs | 2 ++ packages/dao-cw721-extensions/Cargo.toml | 1 + packages/dao-cw721-extensions/src/roles.rs | 3 ++- 25 files changed, 204 insertions(+), 6 deletions(-) create mode 100644 packages/cw-orch/src/external/admin_factory.rs create mode 100644 packages/cw-orch/src/external/cw721_roles.rs create mode 100644 packages/cw-orch/src/external/cw_vesting.rs create mode 100644 packages/cw-orch/src/external/migrator.rs create mode 100644 packages/cw-orch/src/external/mod.rs create mode 100644 packages/cw-orch/src/external/payroll_factory.rs create mode 100644 packages/cw-orch/src/external/token_swap.rs create mode 100644 packages/cw-orch/src/external/tokenfactory_issuer.rs diff --git a/Cargo.lock b/Cargo.lock index fdca8c392..ffe303464 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -988,6 +988,7 @@ dependencies = [ "cosmwasm-std", "cw-admin-factory", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1356,6 +1357,7 @@ dependencies = [ "cosmwasm-std", "cw-denom 2.5.0", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1452,6 +1454,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1467,6 +1470,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-types", @@ -1562,6 +1566,7 @@ dependencies = [ "cosmwasm-std", "cw-denom 2.5.0", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-stake-tracker", "cw-storage-plus 1.2.0", @@ -2034,6 +2039,7 @@ dependencies = [ "cosmwasm-std", "cw-controllers 1.1.2", "cw-multi-test", + "cw-orch", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2053,13 +2059,20 @@ name = "dao-cw-orch" version = "2.5.0" dependencies = [ "cosmwasm-std", + "cw-admin-factory", "cw-orch", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", "cw20-stake 2.5.0", "cw20-stake-external-rewards", "cw20-stake-reward-distributor", "cw721-base 0.18.0", + "cw721-roles", "dao-dao-core 2.5.0", "dao-interface 2.5.0", + "dao-migrator", "dao-pre-propose-approval-single 2.5.0", "dao-pre-propose-approver", "dao-pre-propose-multiple 2.5.0", @@ -2086,6 +2099,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", + "cw-orch", "cw4 1.1.2", ] @@ -2228,6 +2242,7 @@ dependencies = [ "cw-core", "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", "cw-multi-test", + "cw-orch", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", diff --git a/contracts/external/cw-admin-factory/Cargo.toml b/contracts/external/cw-admin-factory/Cargo.toml index 394f859fb..92e299c2f 100644 --- a/contracts/external/cw-admin-factory/Cargo.toml +++ b/contracts/external/cw-admin-factory/Cargo.toml @@ -26,6 +26,7 @@ cosmwasm-std = { workspace = true, features = ["cosmwasm_1_2"] } cosmwasm-schema = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } +cw-orch = { workspace = true } thiserror = { workspace = true } cw-utils = { workspace = true } diff --git a/contracts/external/cw-admin-factory/src/msg.rs b/contracts/external/cw-admin-factory/src/msg.rs index 13016fee1..75a328f61 100644 --- a/contracts/external/cw-admin-factory/src/msg.rs +++ b/contracts/external/cw-admin-factory/src/msg.rs @@ -9,6 +9,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Instantiates the target contract with the provided instantiate message, /// code ID, and label and updates the contract's admin to be itself. @@ -33,7 +34,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { #[returns(AdminResponse)] Admin {}, diff --git a/contracts/external/cw-payroll-factory/Cargo.toml b/contracts/external/cw-payroll-factory/Cargo.toml index 9b89969a5..efd300919 100644 --- a/contracts/external/cw-payroll-factory/Cargo.toml +++ b/contracts/external/cw-payroll-factory/Cargo.toml @@ -24,6 +24,7 @@ cw-ownable = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } cw20 = { workspace = true } +cw-orch = { workspace = true } thiserror = { workspace = true } cw-vesting = { workspace = true, features = ["library"] } cw-utils = { workspace = true } diff --git a/contracts/external/cw-payroll-factory/src/msg.rs b/contracts/external/cw-payroll-factory/src/msg.rs index eacc5357e..b612ffce7 100644 --- a/contracts/external/cw-payroll-factory/src/msg.rs +++ b/contracts/external/cw-payroll-factory/src/msg.rs @@ -11,6 +11,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Instantiates a new vesting contract that is funded by a cw20 token. Receive(Cw20ReceiveMsg), @@ -36,7 +37,7 @@ pub enum ReceiveMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses,cw_orch::QueryFns)] pub enum QueryMsg { /// Returns list of all vesting payment contracts #[returns(Vec)] diff --git a/contracts/external/cw-token-swap/Cargo.toml b/contracts/external/cw-token-swap/Cargo.toml index e974d5453..d10660ac0 100644 --- a/contracts/external/cw-token-swap/Cargo.toml +++ b/contracts/external/cw-token-swap/Cargo.toml @@ -23,6 +23,7 @@ cw-storage-plus = { workspace = true } cw-utils = { workspace = true } cw2 = { workspace = true } cw20 = { workspace = true } +cw-orch = { workspace = true } thiserror = { workspace = true } [dev-dependencies] diff --git a/contracts/external/cw-token-swap/src/msg.rs b/contracts/external/cw-token-swap/src/msg.rs index 1c591d111..2b3dd6580 100644 --- a/contracts/external/cw-token-swap/src/msg.rs +++ b/contracts/external/cw-token-swap/src/msg.rs @@ -32,6 +32,7 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Used to provide cw20 tokens to satisfy a funds promise. Receive(cw20::Cw20ReceiveMsg), @@ -43,7 +44,7 @@ pub enum ExecuteMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { // Gets the current status of the escrow transaction. #[returns(crate::msg::StatusResponse)] diff --git a/contracts/external/cw-tokenfactory-issuer/Cargo.toml b/contracts/external/cw-tokenfactory-issuer/Cargo.toml index 2abbb4180..30449d760 100644 --- a/contracts/external/cw-tokenfactory-issuer/Cargo.toml +++ b/contracts/external/cw-tokenfactory-issuer/Cargo.toml @@ -45,6 +45,7 @@ kujira_tokenfactory = ["cw-tokenfactory-types/kujira_tokenfactory"] cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw2 = { workspace = true } +cw-orch = { workspace = true } cw-ownable = { workspace = true } cw-storage-plus = { workspace = true } cw-tokenfactory-types = { workspace = true, default-features = false } diff --git a/contracts/external/cw-tokenfactory-issuer/src/msg.rs b/contracts/external/cw-tokenfactory-issuer/src/msg.rs index 0660ecd51..6170cddc8 100644 --- a/contracts/external/cw-tokenfactory-issuer/src/msg.rs +++ b/contracts/external/cw-tokenfactory-issuer/src/msg.rs @@ -23,6 +23,7 @@ pub enum InstantiateMsg { /// State changing methods available to this smart contract. #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Allow adds the target address to the allowlist to be able to send or recieve tokens even if the token /// is frozen. Token Factory's BeforeSendHook listener must be set to this contract in order for this feature @@ -108,7 +109,7 @@ pub struct MigrateMsg {} /// Queries supported by this smart contract. #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Returns if token transfer is disabled. Response: IsFrozenResponse #[returns(IsFrozenResponse)] diff --git a/contracts/external/cw-vesting/Cargo.toml b/contracts/external/cw-vesting/Cargo.toml index 2689de7de..2f5204551 100644 --- a/contracts/external/cw-vesting/Cargo.toml +++ b/contracts/external/cw-vesting/Cargo.toml @@ -24,6 +24,7 @@ staking = ["cosmwasm-std/staking"] cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw-denom = { workspace = true } +cw-orch = { workspace = true } cw-ownable = { workspace = true } cw-stake-tracker = { workspace = true } cw-storage-plus = { workspace = true } diff --git a/contracts/external/cw-vesting/src/msg.rs b/contracts/external/cw-vesting/src/msg.rs index 5aac6ca17..a9a89e0ae 100644 --- a/contracts/external/cw-vesting/src/msg.rs +++ b/contracts/external/cw-vesting/src/msg.rs @@ -62,6 +62,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Fund the contract with a cw20 token. The `msg` field must have /// the shape `{"fund":{}}`, and the amount sent must be the same @@ -194,7 +195,7 @@ pub enum ReceiveMsg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Get the current ownership. #[returns(::cw_ownable::Ownership<::cosmwasm_std::Addr>)] diff --git a/contracts/external/cw721-roles/Cargo.toml b/contracts/external/cw721-roles/Cargo.toml index 1a6935974..c5a4ee1d6 100644 --- a/contracts/external/cw721-roles/Cargo.toml +++ b/contracts/external/cw721-roles/Cargo.toml @@ -25,6 +25,7 @@ cw-storage-plus = { workspace = true } cw-utils = { workspace = true } cw2 = { workspace = true } cw4 = { workspace = true } +cw-orch = { workspace = true } cw721 = { workspace = true } cw721-base = { workspace = true, features = ["library"] } dao-cw721-extensions = { workspace = true } diff --git a/contracts/external/dao-migrator/Cargo.toml b/contracts/external/dao-migrator/Cargo.toml index 4d2b48cb8..877838d3c 100644 --- a/contracts/external/dao-migrator/Cargo.toml +++ b/contracts/external/dao-migrator/Cargo.toml @@ -24,6 +24,7 @@ cw-utils = { workspace = true } thiserror = { workspace = true } cw2 = { workspace = true } cw20 = { workspace = true } +cw-orch = { workspace = true } dao-interface = { workspace = true } dao-dao-core = { workspace = true, features = ["library"] } diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index e4d3826e2..7d159b7e9 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -18,6 +18,13 @@ cw20-stake = { version = "2.4.2", path = "../../contracts/staking/cw20-stake" } cw20-stake-external-rewards = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-external-rewards" } cw20-stake-reward-distributor = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-reward-distributor" } cw721-base.workspace = true +cw721-roles = { path = "../../contracts/external/cw721-roles", version = "2.4.2" } +cw-admin-factory = { path = "../../contracts/external/cw-admin-factory", version = "2.5.0" } +cw-vesting = { version = "2.4.2", path = "../../contracts/external/cw-vesting" } +cw-payroll-factory = { version = "2.4.2", path = "../../contracts/external/cw-payroll-factory" } +cw-token-swap = { version = "2.4.2", path = "../../contracts/external/cw-token-swap" } +cw-tokenfactory-issuer = { version = "2.4.2", path = "../../contracts/external/cw-tokenfactory-issuer" } +dao-migrator = { version = "2.4.2", path = "../../contracts/external/dao-migrator" } dao-dao-core = { version = "2.4.2", path = "../../contracts/dao-dao-core" } dao-interface = { version = "2.4.2", path = "../dao-interface" } dao-pre-propose-approval-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approval-single" } diff --git a/packages/cw-orch/src/external/admin_factory.rs b/packages/cw-orch/src/external/admin_factory.rs new file mode 100644 index 000000000..065b26ec4 --- /dev/null +++ b/packages/cw-orch/src/external/admin_factory.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw_admin_factory::contract::{execute, instantiate, query, reply}; +use cw_admin_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalAdminFactory; + +impl Uploadable for DaoExternalAdminFactory { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_admin_factory") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/external/cw721_roles.rs b/packages/cw-orch/src/external/cw721_roles.rs new file mode 100644 index 000000000..61a7d264d --- /dev/null +++ b/packages/cw-orch/src/external/cw721_roles.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw721_roles::contract::{execute, instantiate, query}; +use cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalCw721Roles; + +impl Uploadable for DaoExternalCw721Roles { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_cw721_roles") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} \ No newline at end of file diff --git a/packages/cw-orch/src/external/cw_vesting.rs b/packages/cw-orch/src/external/cw_vesting.rs new file mode 100644 index 000000000..a533b0085 --- /dev/null +++ b/packages/cw-orch/src/external/cw_vesting.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw_vesting::contract::{execute, instantiate, query}; +use cw_vesting::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalCwVesting; + +impl Uploadable for DaoExternalCwVesting { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_cw_vesting") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/external/migrator.rs b/packages/cw-orch/src/external/migrator.rs new file mode 100644 index 000000000..6f3ae1dad --- /dev/null +++ b/packages/cw-orch/src/external/migrator.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_migrator::contract::{execute, instantiate, query, reply}; +use dao_migrator::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalMigrator; + +impl Uploadable for DaoExternalMigrator { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_migrator") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/external/mod.rs b/packages/cw-orch/src/external/mod.rs new file mode 100644 index 000000000..9cd2910a9 --- /dev/null +++ b/packages/cw-orch/src/external/mod.rs @@ -0,0 +1,15 @@ +mod admin_factory; +mod cw721_roles; +mod cw_vesting; +mod migrator; +mod payroll_factory; +mod token_swap; +mod tokenfactory_issuer; + +pub use admin_factory::DaoExternalAdminFactory; +pub use cw721_roles::DaoExternalCw721Roles; +pub use cw_vesting::DaoExternalCwVesting; +pub use migrator::DaoExternalMigrator; +pub use payroll_factory::DaoExternalPayrollFactory; +pub use token_swap::DaoExternalTokenSwap; +pub use tokenfactory_issuer::DaoExternalTokenfactoryIssuer; \ No newline at end of file diff --git a/packages/cw-orch/src/external/payroll_factory.rs b/packages/cw-orch/src/external/payroll_factory.rs new file mode 100644 index 000000000..28af998bd --- /dev/null +++ b/packages/cw-orch/src/external/payroll_factory.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw_payroll_factory::contract::{execute, instantiate, query, reply}; +use cw_payroll_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalPayrollFactory; + +impl Uploadable for DaoExternalPayrollFactory { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_payroll_factory") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/external/token_swap.rs b/packages/cw-orch/src/external/token_swap.rs new file mode 100644 index 000000000..4b9dd8373 --- /dev/null +++ b/packages/cw-orch/src/external/token_swap.rs @@ -0,0 +1,21 @@ +use cosmwasm_std::Reply; +use cw_orch::{interface, prelude::*}; + +use cw_token_swap::contract::{execute, instantiate, migrate, query}; +use cw_token_swap::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] +pub struct DaoExternalTokenSwap; + +impl Uploadable for DaoExternalTokenSwap { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_tokenswap") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_migrate(migrate)) + } +} diff --git a/packages/cw-orch/src/external/tokenfactory_issuer.rs b/packages/cw-orch/src/external/tokenfactory_issuer.rs new file mode 100644 index 000000000..95e7f834c --- /dev/null +++ b/packages/cw-orch/src/external/tokenfactory_issuer.rs @@ -0,0 +1,24 @@ +use cw_orch::{interface, prelude::*}; + +use cw_tokenfactory_issuer::contract::{execute, instantiate, migrate, query, reply}; +use cw_tokenfactory_issuer::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalTokenfactoryIssuer; + +impl Uploadable for DaoExternalTokenfactoryIssuer { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_tokenfactory_issuer") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty(execute, instantiate, query) + .with_reply(reply) + .with_migrate(migrate), + ) + } +} diff --git a/packages/cw-orch/src/lib.rs b/packages/cw-orch/src/lib.rs index 3b933d3b6..7a3794426 100644 --- a/packages/cw-orch/src/lib.rs +++ b/packages/cw-orch/src/lib.rs @@ -1,4 +1,5 @@ mod core; +mod external; mod pre_propose; mod proposal; mod staking; @@ -6,6 +7,7 @@ mod test_contracts; mod voting; pub use core::*; +pub use external::*; pub use pre_propose::*; pub use proposal::*; pub use staking::*; diff --git a/packages/dao-cw721-extensions/Cargo.toml b/packages/dao-cw721-extensions/Cargo.toml index 609e89d0d..f3d2ca49e 100644 --- a/packages/dao-cw721-extensions/Cargo.toml +++ b/packages/dao-cw721-extensions/Cargo.toml @@ -12,3 +12,4 @@ cosmwasm-std = { workspace = true } cosmwasm-schema = { workspace = true } cw-controllers = { workspace = true } cw4 = { workspace = true } +cw-orch = { workspace = true } diff --git a/packages/dao-cw721-extensions/src/roles.rs b/packages/dao-cw721-extensions/src/roles.rs index 0f2c9166a..a303e508e 100644 --- a/packages/dao-cw721-extensions/src/roles.rs +++ b/packages/dao-cw721-extensions/src/roles.rs @@ -10,6 +10,7 @@ pub struct MetadataExt { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteExt { /// Add a new hook to be informed of all membership changes. /// Must be called by Admin @@ -32,7 +33,7 @@ pub enum ExecuteExt { impl CustomMsg for ExecuteExt {} #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryExt { /// Total weight at a given height #[returns(cw4::TotalWeightResponse)] From a90d77c527569a2217f0c02ba3697b0dcf646f69 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Wed, 17 Jul 2024 12:45:09 -0500 Subject: [PATCH 14/50] Set integration_tests toolchain to latest stable --- .github/workflows/integration_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 42af0ab81..49d1a8a11 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -17,11 +17,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 - - name: Install latest nightly toolchain + - name: Install latest stable toolchain uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly-2023-02-02 + toolchain: stable target: wasm32-unknown-unknown override: true From ae81938c9a8832dfbc064ecade3b412d8a55c022 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Wed, 17 Jul 2024 13:18:11 -0500 Subject: [PATCH 15/50] Update basic.yml to cache only cargo deps Nightly toolchain is required for integration_tests --- .github/workflows/basic.yml | 12 ++++-------- .github/workflows/integration_tests.yml | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 9ee97bef6..170a474fc 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -20,16 +20,14 @@ jobs: target: wasm32-unknown-unknown override: true - - name: Rust Dependencies Cache + - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ - target/ - artifacts/ - key: ${{ runner.os }}-cargo-with-artifacts-${{ hashFiles('**/Cargo.lock') }} + key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }} - name: Run tests uses: actions-rs/cargo@v1 @@ -64,16 +62,14 @@ jobs: override: true components: rustfmt, clippy - - name: Rust Dependencies Cache + - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ - target/ - artifacts/ - key: ${{ runner.os }}-cargo-with-artifacts-${{ hashFiles('**/Cargo.lock') }} + key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }} - name: Run cargo fmt uses: actions-rs/cargo@v1 diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 49d1a8a11..66119a9f8 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -17,11 +17,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 - - name: Install latest stable toolchain + - name: Install latest nightly toolchain uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: stable + toolchain: nightly target: wasm32-unknown-unknown override: true From bcbaa7ef9cc51cb8704b0ba0f03405e1527686a4 Mon Sep 17 00:00:00 2001 From: Gabriel Lopez Date: Thu, 18 Jul 2024 20:56:03 -0500 Subject: [PATCH 16/50] Revert integration_tests.yml --- .github/workflows/integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 66119a9f8..42af0ab81 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -21,7 +21,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly + toolchain: nightly-2023-02-02 target: wasm32-unknown-unknown override: true From 1d68601483c18d1c26707a9107322ab37be46ac4 Mon Sep 17 00:00:00 2001 From: Gabe Date: Fri, 19 Jul 2024 02:40:02 -0500 Subject: [PATCH 17/50] Update to cw-orch .24.1 --- Cargo.lock | 139 ++++++++++++++------ Cargo.toml | 2 +- contracts/dao-dao-core/src/tests.rs | 52 ++++---- contracts/test/dao-proposal-sudo/src/msg.rs | 2 +- 4 files changed, 127 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffe303464..5c0fade29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ dependencies = [ "abstract-cw4-group", "abstract-cw4-stake", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", ] [[package]] @@ -69,7 +69,7 @@ dependencies = [ "abstract-cw2", "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -88,7 +88,7 @@ dependencies = [ "abstract-cw2", "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -118,7 +118,7 @@ checksum = "00d5e4b8084c3a2b3e42502e6c4fe3ed985dc72e86eb612bcc527f4a0443fa42" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-utils 1.0.3", "schemars", "serde", @@ -134,7 +134,7 @@ dependencies = [ "abstract-cw20", "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -154,7 +154,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -188,7 +188,7 @@ dependencies = [ "abstract-cw3", "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -209,7 +209,7 @@ dependencies = [ "abstract-cw4", "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -241,7 +241,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -261,7 +261,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-orch", + "cw-orch 0.22.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "schemars", @@ -988,7 +988,7 @@ dependencies = [ "cosmwasm-std", "cw-admin-factory", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1210,9 +1210,30 @@ dependencies = [ "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", - "cw-orch-fns-derive", - "cw-orch-mock", - "cw-orch-traits", + "cw-orch-fns-derive 0.19.1", + "cw-orch-mock 0.22.4", + "cw-orch-traits 0.22.0", + "cw-utils 1.0.3", + "hex", + "log", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-orch" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-orch-contract-derive", + "cw-orch-core", + "cw-orch-fns-derive 0.22.0", + "cw-orch-mock 0.23.2", + "cw-orch-traits 0.23.3", "cw-utils 1.0.3", "hex", "log", @@ -1264,6 +1285,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cw-orch-fns-derive" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e21b23116a0702f540d7fa3f16e8276682d860b589fed56259220ad59d768e" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "cw-orch-mock" version = "0.22.4" @@ -1279,6 +1312,21 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "cw-orch-mock" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57beb30d841bde79df51c9402741ef926ca8ef7ecd3570aa180074f767ac04d3" +dependencies = [ + "abstract-cw-multi-test", + "cosmwasm-std", + "cw-orch-core", + "cw-utils 1.0.3", + "log", + "serde", + "sha2 0.10.8", +] + [[package]] name = "cw-orch-traits" version = "0.22.0" @@ -1290,6 +1338,17 @@ dependencies = [ "prost-types 0.12.3", ] +[[package]] +name = "cw-orch-traits" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e6b81dc282724c9c6334a499f4867e575458e69fe5b99034d4f962860f3357" +dependencies = [ + "cw-orch-core", + "prost 0.12.3", + "prost-types 0.12.3", +] + [[package]] name = "cw-ownable" version = "0.5.1" @@ -1357,7 +1416,7 @@ dependencies = [ "cosmwasm-std", "cw-denom 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1454,7 +1513,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1470,7 +1529,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-types", @@ -1566,7 +1625,7 @@ dependencies = [ "cosmwasm-std", "cw-denom 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-stake-tracker", "cw-storage-plus 1.2.0", @@ -1777,7 +1836,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", @@ -1801,7 +1860,7 @@ dependencies = [ "cosmwasm-std", "cw-controllers 1.1.2", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1822,7 +1881,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2039,7 +2098,7 @@ dependencies = [ "cosmwasm-std", "cw-controllers 1.1.2", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2060,7 +2119,7 @@ version = "2.5.0" dependencies = [ "cosmwasm-std", "cw-admin-factory", - "cw-orch", + "cw-orch 0.22.2", "cw-payroll-factory", "cw-token-swap", "cw-tokenfactory-issuer", @@ -2099,7 +2158,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-orch", + "cw-orch 0.24.1", "cw4 1.1.2", ] @@ -2134,7 +2193,7 @@ dependencies = [ "cosmwasm-std", "cw-core", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2224,7 +2283,7 @@ version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-orch", + "cw-orch 0.24.1", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", @@ -2242,7 +2301,7 @@ dependencies = [ "cw-core", "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", @@ -2373,7 +2432,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2483,7 +2542,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2506,7 +2565,7 @@ dependencies = [ "cosmwasm-std", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2554,7 +2613,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2616,7 +2675,7 @@ dependencies = [ "cw-denom 2.5.0", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", @@ -2652,7 +2711,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw2 1.1.2", "dao-dao-macros 2.5.0", @@ -2698,7 +2757,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-issuer", @@ -2809,7 +2868,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2827,7 +2886,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2865,7 +2924,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2884,7 +2943,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2911,7 +2970,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2972,7 +3031,7 @@ dependencies = [ "cw-controllers 1.1.2", "cw-hooks 2.5.0", "cw-multi-test", - "cw-orch", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-issuer", diff --git a/Cargo.toml b/Cargo.toml index 79011d8c7..9a1ccb90b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,7 +80,7 @@ syn = { version = "1.0", features = ["derive"] } test-context = "0.1" thiserror = { version = "1.0" } wynd-utils = "0.4" -cw-orch = "0.22.2" +cw-orch = "0.24.1" # One commit ahead of version 0.3.0. Allows initialization with an # optional owner. diff --git a/contracts/dao-dao-core/src/tests.rs b/contracts/dao-dao-core/src/tests.rs index e20eab146..52a350ec9 100644 --- a/contracts/dao-dao-core/src/tests.rs +++ b/contracts/dao-dao-core/src/tests.rs @@ -223,7 +223,7 @@ fn test_update_config() -> cw_orch::anyhow::Result<()> { gov.upload()?; let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -290,7 +290,7 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -436,7 +436,7 @@ fn test_removed_modules_can_not_execute() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -555,7 +555,7 @@ fn test_module_already_disabled() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -632,7 +632,7 @@ fn test_swap_voting_module() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -704,7 +704,7 @@ fn test_permissions() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -791,7 +791,7 @@ fn do_standard_instantiate( cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { @@ -801,7 +801,7 @@ fn do_standard_instantiate( symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), + address: mock.sender_addr().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1168,7 +1168,7 @@ fn test_passthrough_voting_queries() { let (gov, _, mock, _) = do_standard_instantiate(true, false); assert_eq!( - gov.voting_power_at_height(mock.sender().to_string(), None) + gov.voting_power_at_height(mock.sender_addr().to_string(), None) .unwrap(), VotingPowerAtHeightResponse { power: Uint128::from(2u64), @@ -1234,7 +1234,7 @@ fn test_list_items() { gov.upload().unwrap(); cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { @@ -1244,7 +1244,7 @@ fn test_list_items() { symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), + address: mock.sender_addr().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1335,7 +1335,7 @@ fn test_instantiate_with_items() { cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { @@ -1345,7 +1345,7 @@ fn test_instantiate_with_items() { symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), + address: mock.sender_addr().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1578,7 +1578,7 @@ fn test_cw721_receive() { &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: mock.sender().to_string(), + minter: mock.sender_addr().to_string(), }, None, None, @@ -1592,7 +1592,7 @@ fn test_cw721_receive() { &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: mock.sender().to_string(), + minter: mock.sender_addr().to_string(), }, None, None, @@ -1603,7 +1603,7 @@ fn test_cw721_receive() { .execute( &cw721_base::msg::ExecuteMsg::, Empty>::Mint { token_id: "ekez".to_string(), - owner: mock.sender().to_string(), + owner: mock.sender_addr().to_string(), token_uri: None, extension: None, }, @@ -1678,7 +1678,7 @@ fn test_cw721_receive_no_auto_add() { &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: mock.sender().to_string(), + minter: mock.sender_addr().to_string(), }, None, None, @@ -1692,7 +1692,7 @@ fn test_cw721_receive_no_auto_add() { &cw721_base::msg::InstantiateMsg { name: "ekez".to_string(), symbol: "ekez".to_string(), - minter: mock.sender().to_string(), + minter: mock.sender_addr().to_string(), }, None, None, @@ -1899,7 +1899,7 @@ fn test_migrate_from_compatible() { cw20.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { @@ -1909,7 +1909,7 @@ fn test_migrate_from_compatible() { symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), + address: mock.sender_addr().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -1942,7 +1942,7 @@ fn test_migrate_from_compatible() { initial_items: None, }; - gov.instantiate(&gov_instantiate, Some(&mock.sender()), None) + gov.instantiate(&gov_instantiate, Some(&mock.sender_addr()), None) .unwrap(); let state = gov.dump_state().unwrap(); @@ -1973,7 +1973,7 @@ fn test_migrate_from_beta() { cw20.upload().unwrap(); let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let voting_instantiate = dao_voting_cw20_balance::msg::InstantiateMsg { token_info: dao_voting_cw20_balance::msg::TokenInfo::New { @@ -1983,7 +1983,7 @@ fn test_migrate_from_beta() { symbol: "DAO".to_string(), decimals: 6, initial_balances: vec![cw20::Cw20Coin { - address: mock.sender().to_string(), + address: mock.sender_addr().to_string(), amount: Uint128::from(2u64), }], marketing: None, @@ -2022,7 +2022,7 @@ fn test_migrate_from_beta() { }; v1_gov - .instantiate(&v1_core_instantiate, Some(&mock.sender()), None) + .instantiate(&v1_core_instantiate, Some(&mock.sender_addr()), None) .unwrap(); gov.set_address(&v1_gov.address().unwrap()); @@ -2154,7 +2154,7 @@ fn test_module_prefixes() { gov.upload().unwrap(); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { - root: mock.sender().to_string(), + root: mock.sender_addr().to_string(), }; let gov_instantiate = InstantiateMsg { @@ -2233,7 +2233,7 @@ fn test_add_remove_subdaos() { let (gov, _proposal, mock, _) = do_standard_instantiate(false, false); test_unauthorized( - &gov.call_as(&mock.sender()), + &gov.call_as(&mock.sender_addr()), ExecuteMsg::UpdateSubDaos { to_add: vec![], to_remove: vec![], diff --git a/contracts/test/dao-proposal-sudo/src/msg.rs b/contracts/test/dao-proposal-sudo/src/msg.rs index de00f94ad..f6b6e32dc 100644 --- a/contracts/test/dao-proposal-sudo/src/msg.rs +++ b/contracts/test/dao-proposal-sudo/src/msg.rs @@ -9,7 +9,7 @@ pub struct InstantiateMsg { #[cw_serde] #[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { - #[fn_name("proposal_execute")] + #[cw_orch(fn_name("proposal_execute"))] Execute { msgs: Vec }, } From 48c0067d750ebaf3aea9aef2c8e53f7bfaecbb65 Mon Sep 17 00:00:00 2001 From: Gabe Date: Fri, 19 Jul 2024 12:06:17 -0500 Subject: [PATCH 18/50] Lint + not(target_arch = "wasm32") in lib.rs --- contracts/external/cw-payroll-factory/src/msg.rs | 2 +- packages/cw-orch/src/core.rs | 5 +---- packages/cw-orch/src/external/cw721_roles.rs | 2 +- packages/cw-orch/src/external/mod.rs | 2 +- packages/cw-orch/src/external/token_swap.rs | 1 - packages/cw-orch/src/lib.rs | 14 ++++++++++++++ .../cw-orch/src/pre_propose/approval_single.rs | 5 +---- packages/cw-orch/src/pre_propose/approver.rs | 5 +---- packages/cw-orch/src/pre_propose/multiple.rs | 5 +---- packages/cw-orch/src/pre_propose/single.rs | 5 +---- packages/cw-orch/src/proposal/condorcet.rs | 5 +---- packages/cw-orch/src/proposal/multiple.rs | 5 +---- packages/cw-orch/src/proposal/single.rs | 5 +---- packages/cw-orch/src/staking/cw20_stake.rs | 5 +---- packages/cw-orch/src/staking/external_rewards.rs | 5 +---- packages/cw-orch/src/staking/reward_distributor.rs | 5 +---- packages/cw-orch/src/test_contracts/cw721.rs | 6 +----- .../src/test_contracts/proposal_hook_counter.rs | 5 +---- .../cw-orch/src/test_contracts/proposal_sudo.rs | 5 +---- .../src/test_contracts/test_custom_factory.rs | 5 +---- .../src/test_contracts/voting_cw20_balance.rs | 5 +---- packages/cw-orch/src/voting/cw20_staked.rs | 5 +---- packages/cw-orch/src/voting/cw4.rs | 5 +---- packages/cw-orch/src/voting/cw721_roles.rs | 5 +---- packages/cw-orch/src/voting/cw721_staked.rs | 5 +---- packages/cw-orch/src/voting/token_staked.rs | 5 +---- 26 files changed, 38 insertions(+), 89 deletions(-) diff --git a/contracts/external/cw-payroll-factory/src/msg.rs b/contracts/external/cw-payroll-factory/src/msg.rs index b612ffce7..aeff10187 100644 --- a/contracts/external/cw-payroll-factory/src/msg.rs +++ b/contracts/external/cw-payroll-factory/src/msg.rs @@ -37,7 +37,7 @@ pub enum ReceiveMsg { } #[cw_serde] -#[derive(QueryResponses,cw_orch::QueryFns)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Returns list of all vesting payment contracts #[returns(Vec)] diff --git a/packages/cw-orch/src/core.rs b/packages/cw-orch/src/core.rs index ff7fd24ea..501d56f4e 100644 --- a/packages/cw-orch/src/core.rs +++ b/packages/cw-orch/src/core.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_dao_core::contract::{execute, instantiate, migrate, query, reply}; use dao_interface::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_interface::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoDaoCore; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoDaoCore { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/external/cw721_roles.rs b/packages/cw-orch/src/external/cw721_roles.rs index 61a7d264d..f7fd355d0 100644 --- a/packages/cw-orch/src/external/cw721_roles.rs +++ b/packages/cw-orch/src/external/cw721_roles.rs @@ -17,4 +17,4 @@ impl Uploadable for DaoExternalCw721Roles { fn wrapper() -> Box> { Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) } -} \ No newline at end of file +} diff --git a/packages/cw-orch/src/external/mod.rs b/packages/cw-orch/src/external/mod.rs index 9cd2910a9..eb1f8b82b 100644 --- a/packages/cw-orch/src/external/mod.rs +++ b/packages/cw-orch/src/external/mod.rs @@ -12,4 +12,4 @@ pub use cw_vesting::DaoExternalCwVesting; pub use migrator::DaoExternalMigrator; pub use payroll_factory::DaoExternalPayrollFactory; pub use token_swap::DaoExternalTokenSwap; -pub use tokenfactory_issuer::DaoExternalTokenfactoryIssuer; \ No newline at end of file +pub use tokenfactory_issuer::DaoExternalTokenfactoryIssuer; diff --git a/packages/cw-orch/src/external/token_swap.rs b/packages/cw-orch/src/external/token_swap.rs index 4b9dd8373..39ddcea10 100644 --- a/packages/cw-orch/src/external/token_swap.rs +++ b/packages/cw-orch/src/external/token_swap.rs @@ -1,4 +1,3 @@ -use cosmwasm_std::Reply; use cw_orch::{interface, prelude::*}; use cw_token_swap::contract::{execute, instantiate, migrate, query}; diff --git a/packages/cw-orch/src/lib.rs b/packages/cw-orch/src/lib.rs index 7a3794426..23b7031a5 100644 --- a/packages/cw-orch/src/lib.rs +++ b/packages/cw-orch/src/lib.rs @@ -1,17 +1,31 @@ +#[cfg(not(target_arch = "wasm32"))] mod core; +#[cfg(not(target_arch = "wasm32"))] mod external; +#[cfg(not(target_arch = "wasm32"))] mod pre_propose; +#[cfg(not(target_arch = "wasm32"))] mod proposal; +#[cfg(not(target_arch = "wasm32"))] mod staking; +#[cfg(not(target_arch = "wasm32"))] mod test_contracts; +#[cfg(not(target_arch = "wasm32"))] mod voting; +#[cfg(not(target_arch = "wasm32"))] pub use core::*; +#[cfg(not(target_arch = "wasm32"))] pub use external::*; +#[cfg(not(target_arch = "wasm32"))] pub use pre_propose::*; +#[cfg(not(target_arch = "wasm32"))] pub use proposal::*; +#[cfg(not(target_arch = "wasm32"))] pub use staking::*; +#[cfg(not(target_arch = "wasm32"))] pub use test_contracts::*; +#[cfg(not(target_arch = "wasm32"))] pub use voting::*; #[cfg(feature = "wasm_test")] diff --git a/packages/cw-orch/src/pre_propose/approval_single.rs b/packages/cw-orch/src/pre_propose/approval_single.rs index 6dffb7e26..98b9927f6 100644 --- a/packages/cw-orch/src/pre_propose/approval_single.rs +++ b/packages/cw-orch/src/pre_propose/approval_single.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_pre_propose_approval_single::contract::{execute, instantiate, query}; use dao_pre_propose_approval_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_pre_propose_approval_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg} #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeApprovalSingle; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeApprovalSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/approver.rs b/packages/cw-orch/src/pre_propose/approver.rs index 85db3924d..cebd7c13a 100644 --- a/packages/cw-orch/src/pre_propose/approver.rs +++ b/packages/cw-orch/src/pre_propose/approver.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_pre_propose_approver::contract::{execute, instantiate, query}; use dao_pre_propose_approver::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_pre_propose_approver::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeApprover; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeApprover { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/multiple.rs b/packages/cw-orch/src/pre_propose/multiple.rs index 4c5cafdb4..7517df320 100644 --- a/packages/cw-orch/src/pre_propose/multiple.rs +++ b/packages/cw-orch/src/pre_propose/multiple.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_pre_propose_multiple::contract::{execute, instantiate, query}; use dao_pre_propose_multiple::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_pre_propose_multiple::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeMultiple; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeMultiple { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/pre_propose/single.rs b/packages/cw-orch/src/pre_propose/single.rs index 5934c3e45..891654455 100644 --- a/packages/cw-orch/src/pre_propose/single.rs +++ b/packages/cw-orch/src/pre_propose/single.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_pre_propose_single::contract::{execute, instantiate, query}; use dao_pre_propose_single::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_pre_propose_single::contract::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoPreProposeSingle; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoPreProposeSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/condorcet.rs b/packages/cw-orch/src/proposal/condorcet.rs index 5bfce3f22..fdfb8fb50 100644 --- a/packages/cw-orch/src/proposal/condorcet.rs +++ b/packages/cw-orch/src/proposal/condorcet.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_proposal_condorcet::contract::{execute, instantiate, query, reply}; use dao_proposal_condorcet::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_proposal_condorcet::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalCondorcet; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalCondorcet { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/multiple.rs b/packages/cw-orch/src/proposal/multiple.rs index d5d482ae6..dc28e8ef0 100644 --- a/packages/cw-orch/src/proposal/multiple.rs +++ b/packages/cw-orch/src/proposal/multiple.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_proposal_multiple::contract::{execute, instantiate, migrate, query, reply}; use dao_proposal_multiple::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_proposal_multiple::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMs #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoProposalMultiple; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalMultiple { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/proposal/single.rs b/packages/cw-orch/src/proposal/single.rs index c84617f21..7db09ee3b 100644 --- a/packages/cw-orch/src/proposal/single.rs +++ b/packages/cw-orch/src/proposal/single.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_proposal_single::contract::{execute, instantiate, migrate, query, reply}; use dao_proposal_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_proposal_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg} #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoProposalSingle; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalSingle { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/cw20_stake.rs b/packages/cw-orch/src/staking/cw20_stake.rs index bfbfeb054..8b43d844c 100644 --- a/packages/cw-orch/src/staking/cw20_stake.rs +++ b/packages/cw-orch/src/staking/cw20_stake.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use cw20_stake::contract::{execute, instantiate, migrate, query}; use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20Stake; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20Stake { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/external_rewards.rs b/packages/cw-orch/src/staking/external_rewards.rs index 919b66b3d..0d4f19c5c 100644 --- a/packages/cw-orch/src/staking/external_rewards.rs +++ b/packages/cw-orch/src/staking/external_rewards.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use cw20_stake_external_rewards::contract::{execute, instantiate, migrate, query}; use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Q #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20StakeExternalRewards; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20StakeExternalRewards { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/staking/reward_distributor.rs b/packages/cw-orch/src/staking/reward_distributor.rs index cc6e4f7a8..2f398ca81 100644 --- a/packages/cw-orch/src/staking/reward_distributor.rs +++ b/packages/cw-orch/src/staking/reward_distributor.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use cw20_stake_reward_distributor::contract::{execute, instantiate, migrate, query}; use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct Cw20StakeRewardDistributor; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw20StakeRewardDistributor { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/cw721.rs b/packages/cw-orch/src/test_contracts/cw721.rs index 2959d2090..8f1097f08 100644 --- a/packages/cw-orch/src/test_contracts/cw721.rs +++ b/packages/cw-orch/src/test_contracts/cw721.rs @@ -3,15 +3,12 @@ use cw721_base::{ entry::{execute, instantiate, query}, ExecuteMsg, InstantiateMsg, QueryMsg, }; -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; pub type Cw721BaseQueryMsg = QueryMsg; #[interface(InstantiateMsg, ExecuteMsg, Cw721BaseQueryMsg, Empty)] pub struct Cw721BaseGeneric; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for Cw721BaseGeneric { // Return a CosmWasm contract wrapper fn wrapper() -> Box> { @@ -19,5 +16,4 @@ impl Uploadable for Cw721BaseGeneric { } } -#[cfg(not(target_arch = "wasm32"))] pub type Cw721Base = Cw721BaseGeneric, Empty>; diff --git a/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs index 5702cf132..7dc26654e 100644 --- a/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs +++ b/packages/cw-orch/src/test_contracts/proposal_hook_counter.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_proposal_hook_counter::contract::{execute, instantiate, query}; use dao_proposal_hook_counter::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_proposal_hook_counter::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalHookCounter; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalHookCounter { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/proposal_sudo.rs b/packages/cw-orch/src/test_contracts/proposal_sudo.rs index 27ba05201..bd623624a 100644 --- a/packages/cw-orch/src/test_contracts/proposal_sudo.rs +++ b/packages/cw-orch/src/test_contracts/proposal_sudo.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_proposal_sudo::contract::{execute, instantiate, query}; use dao_proposal_sudo::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_proposal_sudo::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoProposalSudo; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoProposalSudo { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/test_custom_factory.rs b/packages/cw-orch/src/test_contracts/test_custom_factory.rs index e6dd8e963..3424df887 100644 --- a/packages/cw-orch/src/test_contracts/test_custom_factory.rs +++ b/packages/cw-orch/src/test_contracts/test_custom_factory.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_test_custom_factory::contract::{execute, instantiate, query, reply}; use dao_test_custom_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_test_custom_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoTestCustomFactory; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoTestCustomFactory { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs index 15b8c2cb3..fdf7b84c0 100644 --- a/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs +++ b/packages/cw-orch/src/test_contracts/voting_cw20_balance.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_cw20_balance::contract::{execute, instantiate, query, reply}; use dao_voting_cw20_balance::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_cw20_balance::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoVotingCw20Balance; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw20Balance { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw20_staked.rs b/packages/cw-orch/src/voting/cw20_staked.rs index 33ee57ed3..1f044a913 100644 --- a/packages/cw-orch/src/voting/cw20_staked.rs +++ b/packages/cw-orch/src/voting/cw20_staked.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_cw20_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw20_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_cw20_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryM #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw20Staked; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw20Staked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw4.rs b/packages/cw-orch/src/voting/cw4.rs index d230cd5a1..11dfac5ea 100644 --- a/packages/cw-orch/src/voting/cw4.rs +++ b/packages/cw-orch/src/voting/cw4.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_cw4::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw4::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_cw4::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw4; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw4 { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw721_roles.rs b/packages/cw-orch/src/voting/cw721_roles.rs index 395d3b0ed..6469a0887 100644 --- a/packages/cw-orch/src/voting/cw721_roles.rs +++ b/packages/cw-orch/src/voting/cw721_roles.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_cw721_roles::contract::{execute, instantiate, query, reply}; use dao_voting_cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_cw721_roles::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoVotingCw721Roles; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw721Roles { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/cw721_staked.rs b/packages/cw-orch/src/voting/cw721_staked.rs index e5b4bb02d..5ed2f1ce1 100644 --- a/packages/cw-orch/src/voting/cw721_staked.rs +++ b/packages/cw-orch/src/voting/cw721_staked.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_cw721_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_cw721_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_cw721_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Query #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingCw721Staked; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingCw721Staked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { diff --git a/packages/cw-orch/src/voting/token_staked.rs b/packages/cw-orch/src/voting/token_staked.rs index 733e00260..a8f41ca94 100644 --- a/packages/cw-orch/src/voting/token_staked.rs +++ b/packages/cw-orch/src/voting/token_staked.rs @@ -1,6 +1,4 @@ -use cw_orch::interface; -#[cfg(not(target_arch = "wasm32"))] -use cw_orch::prelude::*; +use cw_orch::{interface, prelude::*}; use dao_voting_token_staked::contract::{execute, instantiate, migrate, query, reply}; use dao_voting_token_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -8,7 +6,6 @@ use dao_voting_token_staked::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, Query #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] pub struct DaoVotingTokenStaked; -#[cfg(not(target_arch = "wasm32"))] impl Uploadable for DaoVotingTokenStaked { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { From c5995c0e4aff42d38bf68357bb3f976cbf1d8670 Mon Sep 17 00:00:00 2001 From: Gabe Date: Fri, 19 Jul 2024 12:08:16 -0500 Subject: [PATCH 19/50] Revert basic.yml i think caching is causing issues with the cargo.lock --- .github/workflows/basic.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 170a474fc..56580ba10 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -20,15 +20,6 @@ jobs: target: wasm32-unknown-unknown override: true - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }} - - name: Run tests uses: actions-rs/cargo@v1 with: @@ -62,15 +53,6 @@ jobs: override: true components: rustfmt, clippy - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }} - - name: Run cargo fmt uses: actions-rs/cargo@v1 with: From 2478f28d9eb9a309030fdff7a825827d79830698 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Mon, 22 Jul 2024 16:35:28 +0000 Subject: [PATCH 20/50] bump /external --- packages/cw-orch/src/external/admin_factory.rs | 2 +- packages/cw-orch/src/external/cw721_roles.rs | 2 +- packages/cw-orch/src/external/cw_vesting.rs | 2 +- packages/cw-orch/src/external/payroll_factory.rs | 2 +- packages/cw-orch/src/external/token_swap.rs | 2 +- packages/cw-orch/src/external/tokenfactory_issuer.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cw-orch/src/external/admin_factory.rs b/packages/cw-orch/src/external/admin_factory.rs index 065b26ec4..2fa5f726b 100644 --- a/packages/cw-orch/src/external/admin_factory.rs +++ b/packages/cw-orch/src/external/admin_factory.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalAdminFactory { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_admin_factory") + .find_wasm_path("cw_admin_factory") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/external/cw721_roles.rs b/packages/cw-orch/src/external/cw721_roles.rs index f7fd355d0..b2b40ab18 100644 --- a/packages/cw-orch/src/external/cw721_roles.rs +++ b/packages/cw-orch/src/external/cw721_roles.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalCw721Roles { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_cw721_roles") + .find_wasm_path("cw721_roles") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/external/cw_vesting.rs b/packages/cw-orch/src/external/cw_vesting.rs index a533b0085..ecf9e30cb 100644 --- a/packages/cw-orch/src/external/cw_vesting.rs +++ b/packages/cw-orch/src/external/cw_vesting.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalCwVesting { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_cw_vesting") + .find_wasm_path("cw_vesting") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/external/payroll_factory.rs b/packages/cw-orch/src/external/payroll_factory.rs index 28af998bd..64ce0b0db 100644 --- a/packages/cw-orch/src/external/payroll_factory.rs +++ b/packages/cw-orch/src/external/payroll_factory.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalPayrollFactory { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_payroll_factory") + .find_wasm_path("cw_payroll_factory") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/external/token_swap.rs b/packages/cw-orch/src/external/token_swap.rs index 39ddcea10..d2b097a43 100644 --- a/packages/cw-orch/src/external/token_swap.rs +++ b/packages/cw-orch/src/external/token_swap.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalTokenSwap { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_tokenswap") + .find_wasm_path("cw_tokenswap") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/external/tokenfactory_issuer.rs b/packages/cw-orch/src/external/tokenfactory_issuer.rs index 95e7f834c..4c9b0d8e8 100644 --- a/packages/cw-orch/src/external/tokenfactory_issuer.rs +++ b/packages/cw-orch/src/external/tokenfactory_issuer.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalTokenfactoryIssuer { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("dao_tokenfactory_issuer") + .find_wasm_path("cw_tokenfactory_issuer") .unwrap() } /// Returns a CosmWasm contract wrapper From 9cea2d166e5d973ff50e647ede63e3b3ba3ac827 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 20:38:00 +0000 Subject: [PATCH 21/50] add external contract cw-orch suites --- Cargo.lock | 2257 +++++++++++++++-- Cargo.toml | 1 + scripts/Cargo.toml | 34 + scripts/src/dao.rs | 163 ++ scripts/src/deploy/external.rs | 251 ++ scripts/src/deploy/mod.rs | 1 + scripts/src/lib.rs | 10 + scripts/src/tests/external/admin_factory.rs | 15 + scripts/src/tests/external/cw721_roles.rs | 15 + scripts/src/tests/external/dao_migration.rs | 15 + scripts/src/tests/external/mod.rs | 7 + scripts/src/tests/external/payroll.rs | 15 + scripts/src/tests/external/token_swap.rs | 49 + .../src/tests/external/tokenfactory_issuer.rs | 16 + scripts/src/tests/external/vesting.rs | 16 + scripts/src/tests/mod.rs | 7 + 16 files changed, 2727 insertions(+), 145 deletions(-) create mode 100644 scripts/Cargo.toml create mode 100644 scripts/src/dao.rs create mode 100644 scripts/src/deploy/external.rs create mode 100644 scripts/src/deploy/mod.rs create mode 100644 scripts/src/lib.rs create mode 100644 scripts/src/tests/external/admin_factory.rs create mode 100644 scripts/src/tests/external/cw721_roles.rs create mode 100644 scripts/src/tests/external/dao_migration.rs create mode 100644 scripts/src/tests/external/mod.rs create mode 100644 scripts/src/tests/external/payroll.rs create mode 100644 scripts/src/tests/external/token_swap.rs create mode 100644 scripts/src/tests/external/tokenfactory_issuer.rs create mode 100644 scripts/src/tests/external/vesting.rs create mode 100644 scripts/src/tests/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 5c0fade29..8605f0989 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,6 +304,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.86" @@ -316,6 +331,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -415,6 +441,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base16ct" version = "0.1.1" @@ -439,6 +471,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -486,7 +524,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" dependencies = [ - "bs58", + "bs58 0.4.0", "hmac", "k256 0.11.6", "once_cell", @@ -498,6 +536,50 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58 0.5.1", + "hmac", + "k256 0.13.3", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "bitcoin" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" +dependencies = [ + "bech32 0.9.1", + "bitcoin-private", + "bitcoin_hashes", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -541,7 +623,7 @@ dependencies = [ "anyhow", "cosm-orc", "cosmwasm-std", - "cw-admin-factory", + "cw-admin-factory 2.5.0", "cw-utils 1.0.3", "cw20 1.1.2", "cw20-stake 2.5.0", @@ -550,7 +632,7 @@ dependencies = [ "dao-pre-propose-single 2.5.0", "dao-proposal-single 2.5.0", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "env_logger", "serde", "serde_json", @@ -566,6 +648,15 @@ dependencies = [ "sha2 0.9.9", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", +] + [[package]] name = "btsg-ft-factory" version = "2.5.0" @@ -582,7 +673,27 @@ dependencies = [ "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-token-staked", + "dao-voting-token-staked 2.5.0", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "btsg-ft-factory" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "osmosis-std-derive", "prost 0.12.3", "prost-derive 0.12.3", @@ -643,7 +754,12 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -774,6 +890,18 @@ dependencies = [ "tonic 0.9.2", ] +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", + "tonic 0.10.2", +] + [[package]] name = "cosmos-sdk-proto" version = "0.21.1" @@ -791,7 +919,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" dependencies = [ - "bip32", + "bip32 0.4.0", "cosmos-sdk-proto 0.14.0", "ecdsa 0.14.8", "eyre", @@ -812,7 +940,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa07096219b1817432b8f1e47c22e928c64bbfd231fc08f0a98f0e7ddd602b7" dependencies = [ - "bip32", + "bip32 0.4.0", "cosmos-sdk-proto 0.15.0", "ecdsa 0.14.8", "eyre", @@ -827,6 +955,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" +dependencies = [ + "bip32 0.5.2", + "cosmos-sdk-proto 0.20.0", + "ecdsa 0.16.9", + "eyre", + "k256 0.13.3", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature 2.2.0", + "subtle-encoding", + "tendermint 0.34.1", + "tendermint-rpc 0.34.1", + "thiserror", + "tokio", +] + [[package]] name = "cosmwasm-crypto" version = "1.5.7" @@ -914,6 +1064,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-bigint" version = "0.4.9" @@ -954,7 +1113,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" dependencies = [ - "sct", + "sct 0.6.1", ] [[package]] @@ -970,6 +1129,46 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "cw-address-like" version = "1.0.4" @@ -986,7 +1185,7 @@ dependencies = [ "bech32 0.9.1", "cosmwasm-schema", "cosmwasm-std", - "cw-admin-factory", + "cw-admin-factory 2.5.0", "cw-multi-test", "cw-orch 0.24.1", "cw-storage-plus 1.2.0", @@ -1004,6 +1203,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-admin-factory" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "thiserror", +] + [[package]] name = "cw-controllers" version = "0.11.1" @@ -1126,6 +1339,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-denom" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + [[package]] name = "cw-denom" version = "2.5.0" @@ -1138,6 +1362,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-denom" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + [[package]] name = "cw-fund-distributor" version = "2.5.0" @@ -1154,7 +1389,37 @@ dependencies = [ "cw20-stake 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", + "thiserror", +] + +[[package]] +name = "cw-fund-distributor" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.2.0" +source = "git+https://github.com/DA0-DA0/dao-contracts?branch=main#7f89ad1604e8022f202aef729853b0c8c7196988" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", "thiserror", ] @@ -1170,9 +1435,31 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-hooks" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + [[package]] name = "cw-hooks" version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1228,11 +1515,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" dependencies = [ "anyhow", + "cosmrs 0.15.0", "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", + "cw-orch-daemon", "cw-orch-fns-derive 0.22.0", "cw-orch-mock 0.23.2", + "cw-orch-networks", "cw-orch-traits 0.23.3", "cw-utils 1.0.3", "hex", @@ -1240,6 +1530,7 @@ dependencies = [ "schemars", "serde", "thiserror", + "tokio", ] [[package]] @@ -1273,6 +1564,49 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-orch-daemon" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" +dependencies = [ + "anyhow", + "async-recursion", + "base16", + "base64 0.22.1", + "bitcoin", + "chrono", + "cosmrs 0.15.0", + "cosmwasm-std", + "cw-orch-core", + "cw-orch-networks", + "cw-orch-traits 0.23.3", + "dirs", + "ed25519-dalek 2.1.1", + "eyre", + "file-lock", + "flate2", + "hex", + "hkd32", + "lazy_static", + "log", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "rand_core 0.6.4", + "reqwest", + "ring 0.17.8", + "ripemd", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "tokio", + "tonic 0.10.2", + "uid", +] + [[package]] name = "cw-orch-fns-derive" version = "0.19.1" @@ -1328,13 +1662,23 @@ dependencies = [ ] [[package]] -name = "cw-orch-traits" -version = "0.22.0" +name = "cw-orch-networks" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5959ce29e9d8a52594b47933a0a2736ea94dd9bf5e29b220cbdbe2b097f07c3a" +checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" dependencies = [ "cw-orch-core", - "prost 0.12.3", + "serde", +] + +[[package]] +name = "cw-orch-traits" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5959ce29e9d8a52594b47933a0a2736ea94dd9bf5e29b220cbdbe2b097f07c3a" +dependencies = [ + "cw-orch-core", + "prost 0.12.3", "prost-types 0.12.3", ] @@ -1408,6 +1752,16 @@ dependencies = [ "serde", ] +[[package]] +name = "cw-paginate-storage" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + [[package]] name = "cw-payroll-factory" version = "2.5.0" @@ -1420,7 +1774,7 @@ dependencies = [ "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw-vesting", + "cw-vesting 2.5.0", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -1428,6 +1782,24 @@ dependencies = [ "wynd-utils", ] +[[package]] +name = "cw-payroll-factory" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + [[package]] name = "cw-proposal-single" version = "0.1.0" @@ -1459,7 +1831,17 @@ version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-wormhole", + "cw-wormhole 2.5.0", +] + +[[package]] +name = "cw-stake-tracker" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-wormhole 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", ] [[package]] @@ -1522,6 +1904,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-token-swap" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + [[package]] name = "cw-tokenfactory-issuer" version = "2.5.0" @@ -1532,7 +1929,7 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-types", + "cw-tokenfactory-types 2.5.0", "cw2 1.1.2", "dao-interface 2.5.0", "osmosis-std", @@ -1545,6 +1942,27 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-tokenfactory-issuer" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-types 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "osmosis-std", + "prost 0.12.3", + "prost-derive 0.12.3", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw-tokenfactory-types" version = "2.5.0" @@ -1562,6 +1980,24 @@ dependencies = [ "serde-cw-value", ] +[[package]] +name = "cw-tokenfactory-types" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "osmosis-std", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "serde-cw-value", +] + [[package]] name = "cw-utils" version = "0.11.1" @@ -1627,10 +2063,10 @@ dependencies = [ "cw-multi-test", "cw-orch 0.24.1", "cw-ownable", - "cw-stake-tracker", + "cw-stake-tracker 2.5.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw-wormhole", + "cw-wormhole 2.5.0", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -1640,9 +2076,41 @@ dependencies = [ "wynd-utils", ] +[[package]] +name = "cw-vesting" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-ownable", + "cw-stake-tracker 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-wormhole 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw2 1.1.2", + "cw20 1.1.2", + "serde", + "thiserror", + "wynd-utils", +] + +[[package]] +name = "cw-wormhole" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + [[package]] name = "cw-wormhole" version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1726,6 +2194,19 @@ dependencies = [ "serde", ] +[[package]] +name = "cw20" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a45a8794a5dd33b66af34caee52a7beceb690856adcc1682b6e3db88b2cdee62" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "schemars", + "serde", +] + [[package]] name = "cw20" version = "1.1.2" @@ -1851,6 +2332,30 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20-stake" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-ownable", + "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "cw20-stake-external-rewards" version = "2.5.0" @@ -1874,6 +2379,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20-stake-external-rewards" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "stake-cw20-external-rewards", + "thiserror", +] + [[package]] name = "cw20-stake-reward-distributor" version = "2.5.0" @@ -1893,6 +2420,25 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20-stake-reward-distributor" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "stake-cw20-reward-distributor", + "thiserror", +] + [[package]] name = "cw20-staked-balance-voting" version = "0.1.0" @@ -2090,6 +2636,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw721-controllers" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + [[package]] name = "cw721-roles" version = "2.5.0" @@ -2106,9 +2664,30 @@ dependencies = [ "cw4 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-cw721-extensions", + "dao-cw721-extensions 2.5.0", "dao-testing", - "dao-voting-cw721-staked", + "dao-voting-cw721-staked 2.5.0", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-roles" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-cw721-extensions 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "serde", "thiserror", ] @@ -2118,36 +2697,78 @@ name = "dao-cw-orch" version = "2.5.0" dependencies = [ "cosmwasm-std", - "cw-admin-factory", + "cw-admin-factory 2.5.0", "cw-orch 0.22.2", - "cw-payroll-factory", - "cw-token-swap", - "cw-tokenfactory-issuer", - "cw-vesting", + "cw-payroll-factory 2.5.0", + "cw-token-swap 2.5.0", + "cw-tokenfactory-issuer 2.5.0", + "cw-vesting 2.5.0", "cw20-stake 2.5.0", - "cw20-stake-external-rewards", - "cw20-stake-reward-distributor", + "cw20-stake-external-rewards 2.5.0", + "cw20-stake-reward-distributor 2.5.0", "cw721-base 0.18.0", - "cw721-roles", + "cw721-roles 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", - "dao-migrator", + "dao-migrator 2.5.0", "dao-pre-propose-approval-single 2.5.0", - "dao-pre-propose-approver", + "dao-pre-propose-approver 2.5.0", "dao-pre-propose-multiple 2.5.0", "dao-pre-propose-single 2.5.0", - "dao-proposal-condorcet", - "dao-proposal-hook-counter", + "dao-proposal-condorcet 2.5.0", + "dao-proposal-hook-counter 2.5.0", "dao-proposal-multiple 2.5.0", "dao-proposal-single 2.5.0", - "dao-proposal-sudo", - "dao-test-custom-factory", - "dao-voting-cw20-balance", - "dao-voting-cw20-staked", + "dao-proposal-sudo 2.5.0", + "dao-test-custom-factory 2.5.0", + "dao-voting-cw20-balance 2.5.0", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-roles", - "dao-voting-cw721-staked", - "dao-voting-token-staked", + "dao-voting-cw721-roles 2.5.0", + "dao-voting-cw721-staked 2.5.0", + "dao-voting-token-staked 2.5.0", + "serde", +] + +[[package]] +name = "dao-cw-orch" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cosmwasm-std", + "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-fund-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-token-swap 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw20-stake-external-rewards 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw20-stake-reward-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw721-base 0.18.0", + "cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-dao-core 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-migrator 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-approval-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-approver 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-condorcet 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-hook-counter 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-sudo 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-rewards-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-test-custom-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-balance 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw4 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw721-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-token-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "serde", ] @@ -2162,6 +2783,18 @@ dependencies = [ "cw4 1.1.2", ] +[[package]] +name = "dao-cw721-extensions" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch 0.24.1", + "cw4 1.1.2", +] + [[package]] name = "dao-dao-core" version = "2.4.1" @@ -2177,7 +2810,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw721 0.18.0", - "dao-dao-macros 2.4.2", + "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "dao-interface 2.4.1", "thiserror", ] @@ -2202,11 +2835,30 @@ dependencies = [ "cw20-base 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-cw-orch", + "dao-cw-orch 2.5.0", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", - "dao-proposal-sudo", - "dao-voting-cw20-balance", + "dao-proposal-sudo 2.5.0", + "dao-voting-cw20-balance 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-dao-core" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "thiserror", ] @@ -2224,18 +2876,40 @@ dependencies = [ [[package]] name = "dao-dao-macros" -version = "2.5.0" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" dependencies = [ "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.5.0", - "dao-interface 2.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dao-dao-macros" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "dao-interface 2.5.0", "dao-voting 2.5.0", "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "dao-dao-macros" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "dao-hooks" version = "2.4.1" @@ -2244,12 +2918,25 @@ checksum = "8c85abbadefe491d571f709464a8cfd2fb78b63b0cb6e6ef49104df249e28acc" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2", + "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "cw4 1.1.2", "dao-pre-propose-base 2.4.1", "dao-voting 2.4.1", ] +[[package]] +name = "dao-hooks" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "cw4 1.1.2", + "dao-pre-propose-base 2.4.2", + "dao-voting 2.4.2", +] + [[package]] name = "dao-hooks" version = "2.5.0" @@ -2262,6 +2949,33 @@ dependencies = [ "dao-voting 2.5.0", ] +[[package]] +name = "dao-hooks" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw4 1.1.2", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", +] + +[[package]] +name = "dao-interface" +version = "2.2.0" +source = "git+https://github.com/DA0-DA0/dao-contracts?branch=main#7f89ad1604e8022f202aef729853b0c8c7196988" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.2.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw20 0.16.0", + "cw721 0.16.0", +] + [[package]] name = "dao-interface" version = "2.4.1" @@ -2277,9 +2991,39 @@ dependencies = [ "osmosis-std", ] +[[package]] +name = "dao-interface" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.22.2", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + +[[package]] +name = "dao-interface" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + [[package]] name = "dao-interface" version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2321,11 +3065,44 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", "thiserror", ] +[[package]] +name = "dao-migrator" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-orch 0.24.1", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw20-staked-balance-voting", + "cw4 0.13.4", + "cw4-voting", + "dao-dao-core 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 0.1.0", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw4 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-pre-propose-approval-single" version = "2.4.1" @@ -2371,12 +3148,28 @@ dependencies = [ "dao-testing", "dao-voting 2.4.1", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", "thiserror", ] +[[package]] +name = "dao-pre-propose-approval-single" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-pre-propose-approver" version = "2.5.0" @@ -2399,10 +3192,26 @@ dependencies = [ "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", ] +[[package]] +name = "dao-pre-propose-approver" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-approval-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", +] + [[package]] name = "dao-pre-propose-base" version = "2.4.1" @@ -2412,7 +3221,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-denom 2.4.1", - "cw-hooks 2.4.2", + "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2422,6 +3231,25 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-pre-propose-base" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.2", + "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "cw-orch 0.22.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.4.2", + "dao-voting 2.4.2", + "serde", + "thiserror", +] + [[package]] name = "dao-pre-propose-base" version = "2.5.0" @@ -2445,6 +3273,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-pre-propose-base" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-base 2.4.1", + "dao-voting 2.4.1", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "semver", + "serde", + "thiserror", +] + [[package]] name = "dao-pre-propose-multiple" version = "2.4.1" @@ -2484,11 +3335,23 @@ dependencies = [ "dao-testing", "dao-voting 2.4.1", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", ] +[[package]] +name = "dao-pre-propose-multiple" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", +] + [[package]] name = "dao-pre-propose-single" version = "2.4.1" @@ -2529,11 +3392,23 @@ dependencies = [ "dao-testing", "dao-voting 2.4.1", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", ] +[[package]] +name = "dao-pre-propose-single" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", +] + [[package]] name = "dao-proposal-condorcet" version = "2.5.0" @@ -2557,6 +3432,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-proposal-condorcet" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-proposal-hook-counter" version = "2.5.0" @@ -2576,7 +3468,21 @@ dependencies = [ "dao-interface 2.5.0", "dao-proposal-single 2.5.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance", + "dao-voting-cw20-balance 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-hook-counter" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "thiserror", ] @@ -2588,12 +3494,12 @@ checksum = "51fac47816150063ef09b555f3466f8be99612b76860a20fba7c85bd1854beba" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2", + "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", - "dao-dao-macros 2.4.2", + "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "dao-hooks 2.4.1", "dao-interface 2.4.1", "dao-pre-propose-base 2.4.1", @@ -2631,15 +3537,38 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance", - "dao-voting-cw20-staked", + "dao-voting-cw20-balance 2.5.0", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked", - "dao-voting-token-staked", + "dao-voting-cw721-staked 2.5.0", + "dao-voting-token-staked 2.5.0", "rand", "thiserror", ] +[[package]] +name = "dao-proposal-multiple" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 0.1.0", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-proposal-single" version = "2.4.1" @@ -2648,14 +3577,14 @@ checksum = "2ce91710cfcff1af520cd0e885eee6972aeefbefc1c9da18349e66ab959269bb" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2", + "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", - "dao-dao-macros 2.4.2", + "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "dao-hooks 2.4.1", "dao-interface 2.4.1", "dao-pre-propose-base 2.4.1", @@ -2664,6 +3593,30 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-proposal-single" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "cw-orch 0.22.2", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "dao-hooks 2.4.2", + "dao-interface 2.4.2", + "dao-pre-propose-base 2.4.2", + "dao-voting 0.1.0", + "dao-voting 2.4.2", + "thiserror", +] + [[package]] name = "dao-proposal-single" version = "2.5.0" @@ -2696,11 +3649,50 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance", - "dao-voting-cw20-staked", + "dao-voting-cw20-balance 2.5.0", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked", - "dao-voting-token-staked", + "dao-voting-cw721-staked 2.5.0", + "dao-voting-token-staked 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-single" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 0.1.0", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + +[[package]] +name = "dao-proposal-sudo" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.22.2", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "dao-interface 2.4.2", "thiserror", ] @@ -2719,6 +3711,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-proposal-sudo" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-rewards-distributor" version = "2.5.0" @@ -2742,14 +3749,36 @@ dependencies = [ "dao-interface 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-cw20-staked", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked", - "dao-voting-token-staked", + "dao-voting-cw721-staked 2.5.0", + "dao-voting-token-staked 2.5.0", "semver", "thiserror", ] +[[package]] +name = "dao-rewards-distributor" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw4 1.1.2", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-test-custom-factory" version = "2.5.0" @@ -2760,7 +3789,7 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer", + "cw-tokenfactory-issuer 2.5.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.18.0", @@ -2771,20 +3800,41 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-test-custom-factory" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-testing" version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-admin-factory", + "cw-admin-factory 2.5.0", "cw-core", "cw-hooks 2.5.0", "cw-multi-test", "cw-proposal-single", - "cw-tokenfactory-issuer", + "cw-tokenfactory-issuer 2.5.0", "cw-utils 1.0.3", - "cw-vesting", + "cw-vesting 2.5.0", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -2792,23 +3842,23 @@ dependencies = [ "cw4 1.1.2", "cw4-group 1.1.2", "cw721-base 0.18.0", - "cw721-roles", + "cw721-roles 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-pre-propose-multiple 2.5.0", "dao-pre-propose-single 2.5.0", - "dao-proposal-condorcet", + "dao-proposal-condorcet 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory", + "dao-test-custom-factory 2.5.0", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance", - "dao-voting-cw20-staked", + "dao-voting-cw20-balance 2.5.0", + "dao-voting-cw20-staked 2.5.0", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-roles", - "dao-voting-cw721-staked", + "dao-voting-cw721-roles 2.5.0", + "dao-voting-cw721-staked 2.5.0", "dao-voting-onft-staked", - "dao-voting-token-staked", + "dao-voting-token-staked 2.5.0", "osmosis-std", "osmosis-test-tube", "rand", @@ -2841,11 +3891,27 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw20 1.1.2", - "dao-dao-macros 2.4.2", + "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "dao-interface 2.4.1", "thiserror", ] +[[package]] +name = "dao-voting" +version = "2.4.2" +source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", + "dao-interface 2.4.2", + "thiserror", +] + [[package]] name = "dao-voting" version = "2.5.0" @@ -2861,6 +3927,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-cw20-balance" version = "2.5.0" @@ -2879,6 +3961,24 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting-cw20-balance" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-cw20-staked" version = "2.5.0" @@ -2899,6 +3999,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting-cw20-staked" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-cw4" version = "2.4.1" @@ -2912,7 +4032,7 @@ dependencies = [ "cw2 1.1.2", "cw4 1.1.2", "cw4-group 1.1.2", - "dao-dao-macros 2.4.2", + "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "dao-interface 2.4.1", "thiserror", ] @@ -2935,6 +4055,24 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting-cw4" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw4-group 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-cw721-roles" version = "2.5.0" @@ -2951,15 +4089,37 @@ dependencies = [ "cw4 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-controllers", - "cw721-roles", - "dao-cw721-extensions", + "cw721-controllers 2.5.0", + "cw721-roles 2.5.0", + "dao-cw721-extensions 2.5.0", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", "dao-testing", "thiserror", ] +[[package]] +name = "dao-voting-cw721-roles" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-cw721-extensions 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-cw721-staked" version = "2.5.0" @@ -2976,13 +4136,13 @@ dependencies = [ "cw2 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-controllers", + "cw721-controllers 2.5.0", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter", + "dao-proposal-hook-counter 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory", + "dao-test-custom-factory 2.5.0", "dao-testing", "dao-voting 2.5.0", "osmosis-std", @@ -2991,6 +4151,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting-cw721-staked" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "dao-voting-onft-staked" version = "2.5.0" @@ -3004,13 +4187,13 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721-controllers", + "cw721-controllers 2.5.0", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter", + "dao-proposal-hook-counter 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory", + "dao-test-custom-factory 2.5.0", "dao-testing", "dao-voting 2.5.0", "omniflix-std", @@ -3034,15 +4217,15 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer", + "cw-tokenfactory-issuer 2.5.0", "cw-utils 1.0.3", "cw2 1.1.2", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter", + "dao-proposal-hook-counter 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory", + "dao-test-custom-factory 2.5.0", "dao-testing", "dao-voting 2.5.0", "osmosis-std", @@ -3051,6 +4234,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "dao-voting-token-staked" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "thiserror", +] + [[package]] name = "der" version = "0.6.1" @@ -3130,6 +4335,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "dyn-clone" version = "1.0.17" @@ -3171,25 +4382,63 @@ dependencies = [ "signature 1.6.4", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "serde", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", "sha2 0.9.9", "zeroize", ] +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "ed25519-zebra" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 3.2.0", "hashbrown 0.12.3", "hex", "rand_core 0.6.4", @@ -3243,6 +4492,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -3291,6 +4549,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + [[package]] name = "ff" version = "0.12.1" @@ -3311,6 +4575,32 @@ dependencies = [ "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-lock" +version = "2.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "flate2" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flex-error" version = "0.4.4" @@ -3327,6 +4617,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -3565,6 +4870,27 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkd32" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" +dependencies = [ + "hmac", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "sha2 0.10.8", + "subtle-encoding", + "zeroize", +] + [[package]] name = "hmac" version = "0.12.1" @@ -3658,10 +4984,10 @@ dependencies = [ "headers", "http", "hyper", - "hyper-rustls", - "rustls-native-certs", + "hyper-rustls 0.22.1", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "tower-service", "webpki", ] @@ -3676,14 +5002,28 @@ dependencies = [ "futures-util", "hyper", "log", - "rustls", - "rustls-native-certs", + "rustls 0.19.1", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "webpki", "webpki-roots", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -3696,6 +5036,42 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -3756,21 +5132,21 @@ dependencies = [ "cosmos-sdk-proto 0.19.0", "cosmwasm-std", "cw-utils 1.0.3", - "cw-vesting", + "cw-vesting 2.5.0", "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 2.5.0", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-roles", + "cw721-roles 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-pre-propose-single 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory", + "dao-test-custom-factory 2.5.0", "dao-voting 2.5.0", - "dao-voting-cw20-staked", - "dao-voting-cw721-staked", + "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw721-staked 2.5.0", "env_logger", "once_cell", "rand", @@ -3779,6 +5155,12 @@ dependencies = [ "test-context", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "is-terminal" version = "0.4.13" @@ -3929,6 +5311,16 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" @@ -3980,6 +5372,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nom" version = "7.1.3" @@ -4080,12 +5489,50 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -4149,6 +5596,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + [[package]] name = "paste" version = "1.0.15" @@ -4182,8 +5652,18 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" dependencies = [ - "peg-macros", - "peg-runtime", + "peg-macros 0.7.0", + "peg-runtime 0.7.0", +] + +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros 0.8.4", + "peg-runtime 0.8.3", ] [[package]] @@ -4192,7 +5672,18 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" dependencies = [ - "peg-runtime", + "peg-runtime 0.7.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime 0.8.3", "proc-macro2", "quote", ] @@ -4203,6 +5694,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4306,6 +5803,12 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -4315,6 +5818,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + [[package]] name = "prettyplease" version = "0.2.20" @@ -4455,6 +5968,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -4495,6 +6017,50 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls 0.24.2", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -4525,12 +6091,27 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "ripemd" version = "0.1.3" @@ -4584,6 +6165,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.34" @@ -4598,28 +6188,71 @@ dependencies = [ ] [[package]] -name = "rustls" -version = "0.19.1" +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring 0.16.20", + "sct 0.6.1", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct 0.7.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls 0.19.1", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct", - "webpki", + "base64 0.21.7", ] [[package]] -name = "rustls-native-certs" -version = "0.5.0" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "openssl-probe", - "rustls", - "schannel", - "security-framework", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -4676,14 +6309,52 @@ dependencies = [ "syn 2.0.74", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scripts" +version = "2.5.0" +dependencies = [ + "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-orch 0.24.1", + "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-token-swap 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-cw-orch 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.2.0", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-migrator 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-single 2.4.2", + "dao-proposal-sudo 2.4.2", + "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dotenv", + "pretty_env_logger", +] + [[package]] name = "sct" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -4714,6 +6385,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -4824,6 +6514,18 @@ dependencies = [ "syn 2.0.74", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -4888,6 +6590,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "1.6.4" @@ -4917,6 +6628,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + [[package]] name = "socket2" version = "0.5.7" @@ -4933,6 +6650,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.6.0" @@ -5032,6 +6755,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -5060,6 +6789,40 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "tendermint" version = "0.23.9" @@ -5068,8 +6831,8 @@ checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" dependencies = [ "async-trait", "bytes", - "ed25519", - "ed25519-dalek", + "ed25519 1.5.3", + "ed25519-dalek 1.0.1", "flex-error", "futures", "k256 0.11.6", @@ -5099,8 +6862,8 @@ checksum = "baa1d2d0ec1b531ba7d196f0dbee5e78ed2a82bfba928e88dff64aeec0b26073" dependencies = [ "async-trait", "bytes", - "ed25519", - "ed25519-dalek", + "ed25519 1.5.3", + "ed25519-dalek 1.0.1", "flex-error", "futures", "k256 0.11.6", @@ -5122,6 +6885,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tendermint" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519 2.2.3", + "ed25519-consensus", + "flex-error", + "futures", + "k256 0.13.3", + "num-traits", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature 2.2.0", + "subtle", + "subtle-encoding", + "tendermint-proto 0.34.1", + "time", + "zeroize", +] + [[package]] name = "tendermint-config" version = "0.23.9" @@ -5150,6 +6944,20 @@ dependencies = [ "url", ] +[[package]] +name = "tendermint-config" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint 0.34.1", + "toml", + "url", +] + [[package]] name = "tendermint-proto" version = "0.23.9" @@ -5204,6 +7012,24 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-proto" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-proto" version = "0.35.0" @@ -5236,8 +7062,8 @@ dependencies = [ "http", "hyper", "hyper-proxy", - "hyper-rustls", - "peg", + "hyper-rustls 0.22.1", + "peg 0.7.0", "pin-project", "serde", "serde_bytes", @@ -5251,7 +7077,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] @@ -5269,8 +7095,8 @@ dependencies = [ "http", "hyper", "hyper-proxy", - "hyper-rustls", - "peg", + "hyper-rustls 0.22.1", + "peg 0.7.0", "pin-project", "serde", "serde_bytes", @@ -5285,7 +7111,40 @@ dependencies = [ "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", + "walkdir", +] + +[[package]] +name = "tendermint-rpc" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "peg 0.8.4", + "pin-project", + "rand", + "reqwest", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint 0.34.1", + "tendermint-config 0.34.1", + "tendermint-proto 0.34.1", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid 1.10.0", "walkdir", ] @@ -5397,7 +7256,9 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -5424,17 +7285,37 @@ dependencies = [ "syn 2.0.74", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "rustls", + "rustls 0.19.1", "tokio", "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -5528,6 +7409,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "rustls-pemfile", + "tokio", + "tokio-rustls 0.24.1", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -5619,6 +7531,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +[[package]] +name = "uid" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -5658,6 +7576,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.2" @@ -5675,6 +7599,18 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -5744,6 +7680,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -5789,8 +7737,8 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -5845,6 +7793,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5993,6 +7950,16 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wynd-utils" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 9a1ccb90b..ecd9b0da9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ members = [ "contracts/voting/*", "packages/*", "ci/*", + "scripts" ] resolver = "2" diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml new file mode 100644 index 000000000..b2ce8e0b6 --- /dev/null +++ b/scripts/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "scripts" +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[dependencies] +cw-orch = { workspace = true, features = ["daemon"] } +dao-cw-orch = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } + +# scripts specific +dotenv = { version = "0.15.0" } +pretty_env_logger = { version = "0.5.0" } + +# cw-orch enabled DAO DAO deps +[dev-dependencies] +dao-interface-master = { package = "dao-interface", git = "https://github.com/DA0-DA0/dao-contracts", branch = "main" } +dao-proposal-sudo = { git = "https://github.com/Kayanski/dao-contracts", branch = "development", features = [ + "library", +] } +dao-proposal-single = { git = "https://github.com/Kayanski/dao-contracts", branch = "development", features = [ + "library", +] } + +dao-interface = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +dao-voting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw-payroll-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw-token-swap = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw-admin-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw-tokenfactory-issuer = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw-vesting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +cw721-roles = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file diff --git a/scripts/src/dao.rs b/scripts/src/dao.rs new file mode 100644 index 000000000..be6751cef --- /dev/null +++ b/scripts/src/dao.rs @@ -0,0 +1,163 @@ +use cw_orch::prelude::*; +use dao_cw_orch::{ + DaoDaoCore, DaoExternalAdminFactory, DaoExternalCw721Roles, DaoExternalCwVesting, + DaoExternalMigrator, DaoExternalPayrollFactory, DaoExternalTokenSwap, + DaoExternalTokenfactoryIssuer, DaoProposalSingle, DaoProposalSudo, +}; + +// minimal dao +pub struct DaoDao { + pub dao_core: DaoDaoCore, + pub dao_proposal_single: DaoProposalSingle, + pub dao_proposal_sudo: DaoProposalSudo, +} + +impl DaoDao { + pub fn new(chain: Chain) -> DaoDao { + DaoDao:: { + dao_core: DaoDaoCore::new("dao_dao_core", chain.clone()), + dao_proposal_single: DaoProposalSingle::new("dao_proposal_single", chain.clone()), + dao_proposal_sudo: DaoProposalSudo::new("dao_proposal_sudo", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.dao_core.upload()?; + self.dao_proposal_single.upload()?; + self.dao_proposal_sudo.upload()?; + + Ok(()) + } +} + +// admin factory +pub struct AdminFactorySuite { + pub factory: DaoExternalAdminFactory, +} +impl AdminFactorySuite { + pub fn new(chain: Chain) -> AdminFactorySuite { + AdminFactorySuite:: { + factory: DaoExternalAdminFactory::new("cw_admin_factory", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.factory.upload()?; + + Ok(()) + } +} + +// payroll factory +pub struct PayrollSuite { + pub payroll: DaoExternalPayrollFactory, + pub vesting: DaoExternalCwVesting, +} +impl PayrollSuite { + pub fn new(chain: Chain) -> PayrollSuite { + PayrollSuite:: { + payroll: DaoExternalPayrollFactory::new("cw_payroll", chain.clone()), + vesting: DaoExternalCwVesting::new("cw_vesting", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.payroll.upload()?; + self.vesting.upload()?; + Ok(()) + } +} + +// cw tokenswap +pub struct TokenSwapSuite { + pub tokenswap: DaoExternalTokenSwap, +} +impl TokenSwapSuite { + pub fn new(chain: Chain) -> TokenSwapSuite { + TokenSwapSuite:: { + tokenswap: DaoExternalTokenSwap::new("cw_tokenswap", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.tokenswap.upload()?; + + Ok(()) + } +} + +// cw-tokenfactory issuer +pub struct TokenFactorySuite { + pub tokenfactory: DaoExternalTokenfactoryIssuer, +} +impl TokenFactorySuite { + pub fn new(chain: Chain) -> TokenFactorySuite { + TokenFactorySuite:: { + tokenfactory: DaoExternalTokenfactoryIssuer::new("cw_tokenfactory", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.tokenfactory.upload()?; + + Ok(()) + } +} + +// cw-vesting +pub struct VestingSuite { + pub vesting: DaoExternalCwVesting, +} + +impl VestingSuite { + pub fn new(chain: Chain) -> VestingSuite { + VestingSuite:: { + vesting: DaoExternalCwVesting::new("dao_dao_core", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.vesting.upload()?; + + Ok(()) + } +} + +// cw721 roles + +pub struct Cw721RolesSuite { + pub roles: DaoExternalCw721Roles, +} + +impl Cw721RolesSuite { + pub fn new(chain: Chain) -> Cw721RolesSuite { + Cw721RolesSuite:: { + roles: DaoExternalCw721Roles::new("cw721_roles", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.roles.upload()?; + + Ok(()) + } +} + +// migrator +pub struct DaoMigrationSuite { + pub migrator: DaoExternalMigrator, +} + +impl DaoMigrationSuite { + pub fn new(chain: Chain) -> DaoMigrationSuite { + DaoMigrationSuite:: { + migrator: DaoExternalMigrator::new("dao_migrator", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.migrator.upload()?; + + Ok(()) + } +} diff --git a/scripts/src/deploy/external.rs b/scripts/src/deploy/external.rs new file mode 100644 index 000000000..b344a5aa9 --- /dev/null +++ b/scripts/src/deploy/external.rs @@ -0,0 +1,251 @@ +use crate::dao::*; +use cw_orch::prelude::*; +use cw_tokenfactory_issuer::msg::InstantiateMsg as TokenfactoryIssuerInit; + +// admin factory +impl cw_orch::contract::Deploy for AdminFactorySuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let factory = AdminFactorySuite::new(chain.clone()); + factory.upload()?; + Ok(factory) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.factory)] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: AdminFactorySuite = AdminFactorySuite::store_on(chain.clone()).unwrap(); + suite.factory.instantiate( + &cw_admin_factory::msg::InstantiateMsg { admin: None }, + None, + None, + )?; + Ok(suite) + } +} + +// payroll +impl cw_orch::contract::Deploy for PayrollSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let payroll = PayrollSuite::new(chain.clone()); + payroll.upload()?; + + Ok(payroll) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.payroll)] + } + + fn load_from(chain: Chain) -> Result { + let payroll = Self::new(chain.clone()); + Ok(payroll) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: PayrollSuite = PayrollSuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + let _init = suite.payroll.instantiate( + &cw_payroll_factory::msg::InstantiateMsg { + owner: Some(chain.sender_addr().to_string()), + vesting_code_id: suite.vesting.code_id().unwrap(), + }, + None, + None, + )?; + + Ok(suite) + } +} + +// tokenswap + +impl cw_orch::contract::Deploy for TokenSwapSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let tokenswap = TokenSwapSuite::new(chain.clone()); + tokenswap.upload()?; + Ok(tokenswap) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.tokenswap)] + } + + fn load_from(chain: Chain) -> Result { + let payroll = Self::new(chain.clone()); + Ok(payroll) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: TokenSwapSuite = TokenSwapSuite::store_on(chain.clone()).unwrap(); + Ok(suite) + } +} + +// tokenfactory issuer +impl cw_orch::contract::Deploy for TokenFactorySuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let factory = TokenFactorySuite::new(chain.clone()); + factory.upload()?; + Ok(factory) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.tokenfactory)] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + let init = TokenfactoryIssuerInit::NewToken { + subdenom: "DAOTOKEN".into(), + }; + suite.tokenfactory.instantiate(&init, None, None)?; + Ok(suite) + } +} + +// cw-vesting +impl cw_orch::contract::Deploy for VestingSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let vesting = VestingSuite::new(chain.clone()); + vesting.upload()?; + Ok(vesting) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.vesting)] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: VestingSuite = VestingSuite::store_on(chain.clone()).unwrap(); + Ok(suite) + } +} + +// cw721-roles +impl cw_orch::contract::Deploy for Cw721RolesSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let roles = Cw721RolesSuite::new(chain.clone()); + roles.upload()?; + Ok(roles) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.roles)] + } + + fn load_from(chain: Chain) -> Result { + let roles = Self::new(chain.clone()); + Ok(roles) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: Cw721RolesSuite = Cw721RolesSuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + Ok(suite) + } +} +// dao-migrator +impl cw_orch::contract::Deploy for DaoMigrationSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let roles = DaoMigrationSuite::new(chain.clone()); + roles.upload()?; + Ok(roles) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.migrator)] + } + + fn load_from(chain: Chain) -> Result { + let roles = Self::new(chain.clone()); + Ok(roles) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoMigrationSuite = DaoMigrationSuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + + Ok(suite) + } +} diff --git a/scripts/src/deploy/mod.rs b/scripts/src/deploy/mod.rs new file mode 100644 index 000000000..65972a8a9 --- /dev/null +++ b/scripts/src/deploy/mod.rs @@ -0,0 +1 @@ +mod external; diff --git a/scripts/src/lib.rs b/scripts/src/lib.rs new file mode 100644 index 000000000..144b8025d --- /dev/null +++ b/scripts/src/lib.rs @@ -0,0 +1,10 @@ +#[allow(clippy::collapsible_if)] +fn main() {} + +mod dao; +pub use dao::*; + +#[cfg(test)] +mod deploy; +#[cfg(test)] +mod tests; diff --git a/scripts/src/tests/external/admin_factory.rs b/scripts/src/tests/external/admin_factory.rs new file mode 100644 index 000000000..b5f64c102 --- /dev/null +++ b/scripts/src/tests/external/admin_factory.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + dao::AdminFactorySuite, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_admin() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/cw721_roles.rs b/scripts/src/tests/external/cw721_roles.rs new file mode 100644 index 000000000..202778114 --- /dev/null +++ b/scripts/src/tests/external/cw721_roles.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + tests::{ADMIN, PREFIX}, + Cw721RolesSuite, +}; + +#[test] +fn test_cw721_roles() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = Cw721RolesSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/dao_migration.rs b/scripts/src/tests/external/dao_migration.rs new file mode 100644 index 000000000..0f80a6948 --- /dev/null +++ b/scripts/src/tests/external/dao_migration.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + tests::{ADMIN, PREFIX}, + DaoMigrationSuite, +}; + +#[test] +fn test_dao_migration() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = DaoMigrationSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/mod.rs b/scripts/src/tests/external/mod.rs new file mode 100644 index 000000000..890d1f1b7 --- /dev/null +++ b/scripts/src/tests/external/mod.rs @@ -0,0 +1,7 @@ +pub mod admin_factory; +pub mod cw721_roles; +pub mod payroll; +pub mod token_swap; +pub mod tokenfactory_issuer; +pub mod vesting; +pub mod dao_migration; diff --git a/scripts/src/tests/external/payroll.rs b/scripts/src/tests/external/payroll.rs new file mode 100644 index 000000000..3bb7947f4 --- /dev/null +++ b/scripts/src/tests/external/payroll.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + dao::PayrollSuite, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_payroll() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = PayrollSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/token_swap.rs b/scripts/src/tests/external/token_swap.rs new file mode 100644 index 000000000..f88f0f6b6 --- /dev/null +++ b/scripts/src/tests/external/token_swap.rs @@ -0,0 +1,49 @@ +use cw_orch::{anyhow, prelude::*}; +use cw_token_swap::msg::{Counterparty, InstantiateMsg, TokenInfo}; + +use crate::{ + dao::TokenSwapSuite, + tests::{ADMIN, DAO1, DENOM, PREFIX}, +}; +#[test] +fn test_tokenswap() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = TokenSwapSuite::deploy_on(mock.clone(), admin.clone())?; + setup_tokenswap_helper( + app, + mock.sender.to_string(), + mock.addr_make(DAO1).to_string(), + )?; + + mock.next_block().unwrap(); + Ok(()) +} + +fn setup_tokenswap_helper( + app: TokenSwapSuite, + sender: String, + counterparty: String, +) -> anyhow::Result<()> { + app.tokenswap.instantiate( + &InstantiateMsg { + counterparty_one: Counterparty { + address: sender, + promise: TokenInfo::Native { + denom: DENOM.to_string(), + amount: 1_000u128.into(), + }, + }, + counterparty_two: Counterparty { + address: counterparty, + promise: TokenInfo::Native { + denom: DENOM.to_string(), + amount: 1_000u128.into(), + }, + }, + }, + None, + None, + )?; + Ok(()) +} diff --git a/scripts/src/tests/external/tokenfactory_issuer.rs b/scripts/src/tests/external/tokenfactory_issuer.rs new file mode 100644 index 000000000..16df53d1a --- /dev/null +++ b/scripts/src/tests/external/tokenfactory_issuer.rs @@ -0,0 +1,16 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + dao::TokenFactorySuite, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_tokenfactory() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = TokenFactorySuite::deploy_on(mock.clone(), admin.clone())?; + + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/vesting.rs b/scripts/src/tests/external/vesting.rs new file mode 100644 index 000000000..85a7e1b6e --- /dev/null +++ b/scripts/src/tests/external/vesting.rs @@ -0,0 +1,16 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + dao::TokenFactorySuite, + tests::{ADMIN, PREFIX}, + VestingSuite, +}; + +#[test] +fn test_vesting() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = VestingSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/mod.rs b/scripts/src/tests/mod.rs new file mode 100644 index 000000000..db6082a45 --- /dev/null +++ b/scripts/src/tests/mod.rs @@ -0,0 +1,7 @@ +mod external; + +pub(crate) const PREFIX: &str = "mock"; +pub(crate) const ADMIN: &str = "admin"; +pub(crate) const DENOM: &str = "juno"; + +pub(crate) const DAO1: &str = "dao1"; From 713366dd2876f355eda5f8674b9fd5640694c57c Mon Sep 17 00:00:00 2001 From: Gabe Date: Mon, 22 Jul 2024 17:10:45 -0500 Subject: [PATCH 22/50] Squashed commit of the following: commit f0dceb1c5bddf23b15304449c6b276f0b8576d8d Author: noah Date: Mon Jul 22 14:48:52 2024 -0400 replaced todo with descriptive error (#858) commit aa0fa5f748e8f0c25d8d86daf2b3ca4bed2f5f43 Author: noah Date: Mon Jul 22 14:48:45 2024 -0400 reorganized publish more (#857) commit cf86aedbcdc50bbdfa3846cb037324a901620ea6 Author: noah Date: Mon Jul 22 13:51:46 2024 -0400 added pre-propose v2.4.1 migration tests (#856) commit be861a863a4228d19c2df95ba81de8a891d4643b Author: Jake Hartnell Date: Mon Jul 22 19:45:58 2024 +0200 Add new contracts to publishing script. (#853) commit 71dd1093be2eb4b8cdce646ed2fe1f879de6e120 Author: noah Date: Mon Jul 22 03:56:52 2024 -0400 updated migrate versions (#855) commit 7e6f5cea76a00214af6f21d694b7218138fe7317 Author: noah Date: Mon Jul 22 03:54:17 2024 -0400 started adding pre-propose migration to v2.5.0 (#854) commit 7646730b117f598b4c036417d6ddd661e493550b Author: bekauz Date: Mon Jul 22 09:43:58 2024 +0200 DAO rewards distributor emission rate updates (#848) commit ce946ac9e528152b446b500e9e45cceef9daa85d Author: noah Date: Fri Jul 19 16:23:14 2024 -0400 add info query to pre-propose-base (#852) commit ebc79143e4eb37ef9840d3850d437bc46335ef2d Author: noah Date: Thu Jul 18 13:12:14 2024 -0400 Support instantiate2 in `cw-admin-factory` (#851) commit 8c37b9ec679122d67a29ec80c011612265ae5baf Author: noah Date: Wed Jul 17 16:03:09 2024 -0400 BitSong fantoken factory (#845) --- packages/dao-pre-propose-base/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dao-pre-propose-base/Cargo.toml b/packages/dao-pre-propose-base/Cargo.toml index f8f9e392f..558407cdd 100644 --- a/packages/dao-pre-propose-base/Cargo.toml +++ b/packages/dao-pre-propose-base/Cargo.toml @@ -34,7 +34,7 @@ semver = { workspace = true } cw-denom-v241 = { workspace = true } dao-pre-propose-base-v241 = { workspace = true } dao-voting-v241 = { workspace = true } -cw-orch = {workspace = true} +cw-orch = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } From 79f70528616e96275a3c9eec397b8cfb01724513 Mon Sep 17 00:00:00 2001 From: Gabe Date: Mon, 22 Jul 2024 17:13:40 -0500 Subject: [PATCH 23/50] Add orch payable flag to dao-voting-token-staked stake --- contracts/voting/dao-voting-token-staked/src/msg.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/voting/dao-voting-token-staked/src/msg.rs b/contracts/voting/dao-voting-token-staked/src/msg.rs index 6a71bcaf1..12bd05daf 100644 --- a/contracts/voting/dao-voting-token-staked/src/msg.rs +++ b/contracts/voting/dao-voting-token-staked/src/msg.rs @@ -39,6 +39,7 @@ pub struct InstantiateMsg { #[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Stakes tokens with the contract to get voting power in the DAO + #[cw_orch(payable)] Stake {}, /// Unstakes tokens so that they begin unbonding Unstake { amount: Uint128 }, From e836dd159674e702f073a815e6b8ad1e2ec2cfc9 Mon Sep 17 00:00:00 2001 From: Gabe Date: Tue, 23 Jul 2024 11:09:32 -0500 Subject: [PATCH 24/50] Add more payable flags + distribution contracts to external --- Cargo.lock | 6 +- .../cw-fund-distributor/Cargo.toml | 1 + .../cw-fund-distributor/src/msg.rs | 10 +++- .../dao-rewards-distributor/Cargo.toml | 10 +++- .../dao-rewards-distributor/src/msg.rs | 4 +- .../external/cw-admin-factory/src/msg.rs | 2 + .../external/cw-payroll-factory/src/msg.rs | 1 + contracts/external/cw-token-swap/src/msg.rs | 1 + packages/cw-orch/Cargo.toml | 60 ++++++++++--------- .../src/distribution/cw_fund_distributor.rs | 20 +++++++ .../distribution/dao_rewards_distributor.rs | 20 +++++++ packages/cw-orch/src/distribution/mod.rs | 5 ++ packages/cw-orch/src/external/token_swap.rs | 2 +- packages/cw-orch/src/lib.rs | 4 ++ packages/dao-pre-propose-base/src/msg.rs | 1 + 15 files changed, 111 insertions(+), 36 deletions(-) create mode 100644 packages/cw-orch/src/distribution/cw_fund_distributor.rs create mode 100644 packages/cw-orch/src/distribution/dao_rewards_distributor.rs create mode 100644 packages/cw-orch/src/distribution/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 8605f0989..bd864c59a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1380,6 +1380,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch 0.24.1", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2698,7 +2699,8 @@ version = "2.5.0" dependencies = [ "cosmwasm-std", "cw-admin-factory 2.5.0", - "cw-orch 0.22.2", + "cw-fund-distributor 2.5.0", + "cw-orch 0.24.1", "cw-payroll-factory 2.5.0", "cw-token-swap 2.5.0", "cw-tokenfactory-issuer 2.5.0", @@ -2720,6 +2722,7 @@ dependencies = [ "dao-proposal-multiple 2.5.0", "dao-proposal-single 2.5.0", "dao-proposal-sudo 2.5.0", + "dao-rewards-distributor 2.5.0", "dao-test-custom-factory 2.5.0", "dao-voting-cw20-balance 2.5.0", "dao-voting-cw20-staked 2.5.0", @@ -3735,6 +3738,7 @@ dependencies = [ "cosmwasm-std", "cw-controllers 1.1.2", "cw-multi-test", + "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", diff --git a/contracts/distribution/cw-fund-distributor/Cargo.toml b/contracts/distribution/cw-fund-distributor/Cargo.toml index f73aba4df..fdb1619f3 100644 --- a/contracts/distribution/cw-fund-distributor/Cargo.toml +++ b/contracts/distribution/cw-fund-distributor/Cargo.toml @@ -28,6 +28,7 @@ dao-voting-cw20-staked = { workspace = true } cw20-stake = { workspace = true, features = ["library"] } dao-interface = { workspace = true } cw-paginate-storage = { workspace = true } +cw-orch.workspace = true [dev-dependencies] dao-dao-core = { workspace = true, features = ["library"] } diff --git a/contracts/distribution/cw-fund-distributor/src/msg.rs b/contracts/distribution/cw-fund-distributor/src/msg.rs index abb39389d..26c0984e4 100644 --- a/contracts/distribution/cw-fund-distributor/src/msg.rs +++ b/contracts/distribution/cw-fund-distributor/src/msg.rs @@ -13,11 +13,17 @@ pub struct InstantiateMsg { } #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { Receive(cw20::Cw20ReceiveMsg), + #[cw_orch(payable)] FundNative {}, - ClaimCW20 { tokens: Vec }, - ClaimNatives { denoms: Vec }, + ClaimCW20 { + tokens: Vec, + }, + ClaimNatives { + denoms: Vec, + }, ClaimAll {}, } diff --git a/contracts/distribution/dao-rewards-distributor/Cargo.toml b/contracts/distribution/dao-rewards-distributor/Cargo.toml index 4d38cbc3b..0a76bf320 100644 --- a/contracts/distribution/dao-rewards-distributor/Cargo.toml +++ b/contracts/distribution/dao-rewards-distributor/Cargo.toml @@ -1,6 +1,11 @@ [package] name = "dao-rewards-distributor" -authors = ["Ben2x4 ", "ekez ", "Jake Hartnell ", "bekauz "] +authors = [ + "Ben2x4 ", + "ekez ", + "Jake Hartnell ", + "bekauz ", +] description = "Distributes rewards based on DAO membership." edition = { workspace = true } license = { workspace = true } @@ -21,7 +26,7 @@ cosmwasm-schema = { workspace = true } cw2 = { workspace = true } cw4 = { workspace = true } cw20 = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true, features = ["library"] } cw-controllers = { workspace = true } cw-ownable = { workspace = true } cw-storage-plus = { workspace = true } @@ -31,6 +36,7 @@ dao-interface = { workspace = true } dao-voting = { workspace = true } semver = { workspace = true } thiserror = { workspace = true } +cw-orch.workspace = true [dev-dependencies] cw-multi-test = { workspace = true } diff --git a/contracts/distribution/dao-rewards-distributor/src/msg.rs b/contracts/distribution/dao-rewards-distributor/src/msg.rs index c4f15d020..4ca86340e 100644 --- a/contracts/distribution/dao-rewards-distributor/src/msg.rs +++ b/contracts/distribution/dao-rewards-distributor/src/msg.rs @@ -22,6 +22,7 @@ pub struct InstantiateMsg { #[cw_ownable_execute] #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Called when a member is added or removed /// to a cw4-groups or cw721-roles contract. @@ -49,6 +50,7 @@ pub enum ExecuteMsg { /// Used to fund this contract with cw20 tokens. Receive(Cw20ReceiveMsg), /// Used to fund this contract with native tokens. + #[cw_orch(payable)] Fund(FundMsg), /// Claims rewards for the sender. Claim { id: u64 }, @@ -86,7 +88,7 @@ pub enum ReceiveCw20Msg { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg { /// Returns contract version info #[returns(InfoResponse)] diff --git a/contracts/external/cw-admin-factory/src/msg.rs b/contracts/external/cw-admin-factory/src/msg.rs index 75a328f61..995f75899 100644 --- a/contracts/external/cw-admin-factory/src/msg.rs +++ b/contracts/external/cw-admin-factory/src/msg.rs @@ -13,6 +13,7 @@ pub struct InstantiateMsg { pub enum ExecuteMsg { /// Instantiates the target contract with the provided instantiate message, /// code ID, and label and updates the contract's admin to be itself. + #[cw_orch(payable)] InstantiateContractWithSelfAdmin { instantiate_msg: Binary, code_id: u64, @@ -21,6 +22,7 @@ pub enum ExecuteMsg { /// Instantiates the target contract with the provided instantiate message, /// code ID, label, and salt, via instantiate2 to give a predictable /// address, and updates the contract's admin to be itself. + #[cw_orch(payable)] Instantiate2ContractWithSelfAdmin { instantiate_msg: Binary, code_id: u64, diff --git a/contracts/external/cw-payroll-factory/src/msg.rs b/contracts/external/cw-payroll-factory/src/msg.rs index aeff10187..64f18ddee 100644 --- a/contracts/external/cw-payroll-factory/src/msg.rs +++ b/contracts/external/cw-payroll-factory/src/msg.rs @@ -16,6 +16,7 @@ pub enum ExecuteMsg { /// Instantiates a new vesting contract that is funded by a cw20 token. Receive(Cw20ReceiveMsg), /// Instantiates a new vesting contract that is funded by a native token. + #[cw_orch(payable)] InstantiateNativePayrollContract { instantiate_msg: PayrollInstantiateMsg, label: String, diff --git a/contracts/external/cw-token-swap/src/msg.rs b/contracts/external/cw-token-swap/src/msg.rs index 2b3dd6580..a7530bde5 100644 --- a/contracts/external/cw-token-swap/src/msg.rs +++ b/contracts/external/cw-token-swap/src/msg.rs @@ -37,6 +37,7 @@ pub enum ExecuteMsg { /// Used to provide cw20 tokens to satisfy a funds promise. Receive(cw20::Cw20ReceiveMsg), /// Provides native tokens to satisfy a funds promise. + #[cw_orch(payable)] Fund {}, /// Withdraws provided funds. Only allowed if the other /// counterparty has yet to provide their promised funds. diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index 7d159b7e9..69725bdec 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -13,34 +13,36 @@ wasm_test = [] [dependencies] cosmwasm-std.workspace = true -cw-orch = { version = "0.22.2" } -cw20-stake = { version = "2.4.2", path = "../../contracts/staking/cw20-stake" } -cw20-stake-external-rewards = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-external-rewards" } -cw20-stake-reward-distributor = { version = "2.4.2", path = "../../contracts/staking/cw20-stake-reward-distributor" } +cw-orch.workspace = true +cw20-stake.workspace = true +cw20-stake-external-rewards = { path = "../../contracts/staking/cw20-stake-external-rewards" } +cw20-stake-reward-distributor = { path = "../../contracts/staking/cw20-stake-reward-distributor" } cw721-base.workspace = true -cw721-roles = { path = "../../contracts/external/cw721-roles", version = "2.4.2" } -cw-admin-factory = { path = "../../contracts/external/cw-admin-factory", version = "2.5.0" } -cw-vesting = { version = "2.4.2", path = "../../contracts/external/cw-vesting" } -cw-payroll-factory = { version = "2.4.2", path = "../../contracts/external/cw-payroll-factory" } -cw-token-swap = { version = "2.4.2", path = "../../contracts/external/cw-token-swap" } -cw-tokenfactory-issuer = { version = "2.4.2", path = "../../contracts/external/cw-tokenfactory-issuer" } -dao-migrator = { version = "2.4.2", path = "../../contracts/external/dao-migrator" } -dao-dao-core = { version = "2.4.2", path = "../../contracts/dao-dao-core" } -dao-interface = { version = "2.4.2", path = "../dao-interface" } -dao-pre-propose-approval-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approval-single" } -dao-pre-propose-approver = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-approver" } -dao-pre-propose-multiple = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-multiple" } -dao-pre-propose-single = { version = "2.4.2", path = "../../contracts/pre-propose/dao-pre-propose-single" } -dao-proposal-condorcet = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-condorcet" } -dao-proposal-hook-counter = { version = "2.4.2", path = "../../contracts/test/dao-proposal-hook-counter" } -dao-proposal-multiple = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-multiple" } -dao-proposal-single = { version = "2.4.2", path = "../../contracts/proposal/dao-proposal-single" } -dao-proposal-sudo = { version = "2.4.2", path = "../../contracts/test/dao-proposal-sudo" } -dao-test-custom-factory = { version = "2.4.2", path = "../../contracts/test/dao-test-custom-factory" } -dao-voting-cw20-balance = { version = "2.4.2", path = "../../contracts/test/dao-voting-cw20-balance" } -dao-voting-cw20-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw20-staked" } -dao-voting-cw4 = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw4" } -dao-voting-cw721-roles = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-roles" } -dao-voting-cw721-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-cw721-staked" } -dao-voting-token-staked = { version = "2.4.2", path = "../../contracts/voting/dao-voting-token-staked" } +cw721-roles.workspace = true +cw-admin-factory.workspace = true +cw-vesting.workspace = true +cw-payroll-factory.workspace = true +cw-token-swap = { path = "../../contracts/external/cw-token-swap" } +cw-tokenfactory-issuer.workspace = true +dao-migrator = { path = "../../contracts/external/dao-migrator" } +dao-dao-core.workspace = true +dao-interface.workspace = true +dao-pre-propose-approval-single.workspace = true +dao-pre-propose-approver.workspace = true +dao-pre-propose-multiple.workspace = true +dao-pre-propose-single.workspace = true +dao-proposal-condorcet.workspace = true +dao-proposal-hook-counter.workspace = true +dao-proposal-multiple.workspace = true +dao-proposal-single.workspace = true +dao-proposal-sudo.workspace = true +dao-test-custom-factory.workspace = true +dao-voting-cw20-balance.workspace = true +dao-voting-cw20-staked.workspace = true +dao-voting-cw4.workspace = true +dao-voting-cw721-roles.workspace = true +dao-voting-cw721-staked.workspace = true +dao-voting-token-staked.workspace = true +dao-rewards-distributor.workspace = true +cw-fund-distributor.workspace = true serde.workspace = true diff --git a/packages/cw-orch/src/distribution/cw_fund_distributor.rs b/packages/cw-orch/src/distribution/cw_fund_distributor.rs new file mode 100644 index 000000000..99f20355b --- /dev/null +++ b/packages/cw-orch/src/distribution/cw_fund_distributor.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw_fund_distributor::contract::{execute, instantiate, query}; +use cw_fund_distributor::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct CwFundDistributor; + +impl Uploadable for CwFundDistributor { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("cw_fund_distributor") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/distribution/dao_rewards_distributor.rs b/packages/cw-orch/src/distribution/dao_rewards_distributor.rs new file mode 100644 index 000000000..1ccbb3bb8 --- /dev/null +++ b/packages/cw-orch/src/distribution/dao_rewards_distributor.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use dao_rewards_distributor::contract::{execute, instantiate, query}; +use dao_rewards_distributor::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoRewardsDistributor; + +impl Uploadable for DaoRewardsDistributor { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("dao_rewards_distributor") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query)) + } +} diff --git a/packages/cw-orch/src/distribution/mod.rs b/packages/cw-orch/src/distribution/mod.rs new file mode 100644 index 000000000..c25661379 --- /dev/null +++ b/packages/cw-orch/src/distribution/mod.rs @@ -0,0 +1,5 @@ +mod cw_fund_distributor; +mod dao_rewards_distributor; + +pub use cw_fund_distributor::CwFundDistributor; +pub use dao_rewards_distributor::DaoRewardsDistributor; diff --git a/packages/cw-orch/src/external/token_swap.rs b/packages/cw-orch/src/external/token_swap.rs index d2b097a43..fb6a19855 100644 --- a/packages/cw-orch/src/external/token_swap.rs +++ b/packages/cw-orch/src/external/token_swap.rs @@ -10,7 +10,7 @@ impl Uploadable for DaoExternalTokenSwap { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() - .find_wasm_path("cw_tokenswap") + .find_wasm_path("cw_token_swap") .unwrap() } /// Returns a CosmWasm contract wrapper diff --git a/packages/cw-orch/src/lib.rs b/packages/cw-orch/src/lib.rs index 23b7031a5..9e2cd755c 100644 --- a/packages/cw-orch/src/lib.rs +++ b/packages/cw-orch/src/lib.rs @@ -1,6 +1,8 @@ #[cfg(not(target_arch = "wasm32"))] mod core; #[cfg(not(target_arch = "wasm32"))] +mod distribution; +#[cfg(not(target_arch = "wasm32"))] mod external; #[cfg(not(target_arch = "wasm32"))] mod pre_propose; @@ -16,6 +18,8 @@ mod voting; #[cfg(not(target_arch = "wasm32"))] pub use core::*; #[cfg(not(target_arch = "wasm32"))] +pub use distribution::*; +#[cfg(not(target_arch = "wasm32"))] pub use external::*; #[cfg(not(target_arch = "wasm32"))] pub use pre_propose::*; diff --git a/packages/dao-pre-propose-base/src/msg.rs b/packages/dao-pre-propose-base/src/msg.rs index cfdd8ea64..7a15f3c28 100644 --- a/packages/dao-pre-propose-base/src/msg.rs +++ b/packages/dao-pre-propose-base/src/msg.rs @@ -24,6 +24,7 @@ pub struct InstantiateMsg { pub enum ExecuteMsg { /// Creates a new proposal in the pre-propose module. MSG will be /// serialized and used as the proposal creation message. + #[cw_orch(payable)] Propose { msg: ProposalMessage }, /// Updates the configuration of this module. This will completely From 65091bd321bb495856a5edbd8dfe590559cd1e88 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 21:23:30 +0000 Subject: [PATCH 25/50] add btsg-ft-factory to cw-orch setup --- Cargo.lock | 2 + contracts/external/btsg-ft-factory/Cargo.toml | 3 +- contracts/external/btsg-ft-factory/src/msg.rs | 3 +- packages/cw-orch/Cargo.toml | 1 + .../cw-orch/src/external/btsg_ft_factory.rs | 20 +++ packages/cw-orch/src/external/mod.rs | 2 + scripts/src/dao.rs | 132 --------------- scripts/src/external.rs | 152 ++++++++++++++++++ scripts/src/lib.rs | 6 +- scripts/src/{ => tests}/deploy/external.rs | 56 +++++-- scripts/src/{ => tests}/deploy/mod.rs | 0 scripts/src/tests/external/admin_factory.rs | 2 +- scripts/src/tests/external/btsg_ft_factory.rs | 15 ++ scripts/src/tests/external/mod.rs | 1 + scripts/src/tests/external/payroll.rs | 2 +- scripts/src/tests/external/token_swap.rs | 2 +- .../src/tests/external/tokenfactory_issuer.rs | 2 +- scripts/src/tests/external/vesting.rs | 2 +- scripts/src/tests/mod.rs | 2 +- 19 files changed, 252 insertions(+), 153 deletions(-) create mode 100644 packages/cw-orch/src/external/btsg_ft_factory.rs create mode 100644 scripts/src/external.rs rename scripts/src/{ => tests}/deploy/external.rs (84%) rename scripts/src/{ => tests}/deploy/mod.rs (100%) create mode 100644 scripts/src/tests/external/btsg_ft_factory.rs diff --git a/Cargo.lock b/Cargo.lock index bd864c59a..b0ca69347 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -665,6 +665,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "cw-orch 0.24.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2697,6 +2698,7 @@ dependencies = [ name = "dao-cw-orch" version = "2.5.0" dependencies = [ + "btsg-ft-factory 2.5.0", "cosmwasm-std", "cw-admin-factory 2.5.0", "cw-fund-distributor 2.5.0", diff --git a/contracts/external/btsg-ft-factory/Cargo.toml b/contracts/external/btsg-ft-factory/Cargo.toml index 4d965ec31..e70ec7e6f 100644 --- a/contracts/external/btsg-ft-factory/Cargo.toml +++ b/contracts/external/btsg-ft-factory/Cargo.toml @@ -19,8 +19,9 @@ library = [] [dependencies] cosmwasm-std = { workspace = true } cosmwasm-schema = { workspace = true } -cw-storage-plus = { workspace = true } cw2 = { workspace = true } +cw-orch = { workspace = true } +cw-storage-plus = { workspace = true } dao-interface = { workspace = true } osmosis-std-derive = { workspace = true } prost = { workspace = true } diff --git a/contracts/external/btsg-ft-factory/src/msg.rs b/contracts/external/btsg-ft-factory/src/msg.rs index e54936860..68937afed 100644 --- a/contracts/external/btsg-ft-factory/src/msg.rs +++ b/contracts/external/btsg-ft-factory/src/msg.rs @@ -6,6 +6,7 @@ use dao_interface::token::InitialBalance; pub struct InstantiateMsg {} #[cw_serde] +#[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { /// Issues a new fantoken. Issue(NewFanToken), @@ -36,7 +37,7 @@ pub struct NewFanToken { } #[cw_serde] -#[derive(QueryResponses)] +#[derive(QueryResponses, cw_orch::QueryFns)] pub enum QueryMsg {} #[cw_serde] diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index 69725bdec..2bc5a3112 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -12,6 +12,7 @@ default = [] wasm_test = [] [dependencies] +btsg-ft-factory = { path = "../../contracts/external/btsg-ft-factory" } cosmwasm-std.workspace = true cw-orch.workspace = true cw20-stake.workspace = true diff --git a/packages/cw-orch/src/external/btsg_ft_factory.rs b/packages/cw-orch/src/external/btsg_ft_factory.rs new file mode 100644 index 000000000..22b6aba3e --- /dev/null +++ b/packages/cw-orch/src/external/btsg_ft_factory.rs @@ -0,0 +1,20 @@ +use cw_orch::{interface, prelude::*}; + +use cw_payroll_factory::contract::{execute, instantiate, query, reply}; +use cw_payroll_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] +pub struct DaoExternalFantokenFactory; + +impl Uploadable for DaoExternalFantokenFactory { + /// Return the path to the wasm file corresponding to the contract + fn wasm(_chain: &ChainInfoOwned) -> WasmPath { + artifacts_dir_from_workspace!() + .find_wasm_path("btsg_ft_factory") + .unwrap() + } + /// Returns a CosmWasm contract wrapper + fn wrapper() -> Box> { + Box::new(ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply)) + } +} diff --git a/packages/cw-orch/src/external/mod.rs b/packages/cw-orch/src/external/mod.rs index eb1f8b82b..c5c5ad30f 100644 --- a/packages/cw-orch/src/external/mod.rs +++ b/packages/cw-orch/src/external/mod.rs @@ -5,6 +5,7 @@ mod migrator; mod payroll_factory; mod token_swap; mod tokenfactory_issuer; +mod btsg_ft_factory; pub use admin_factory::DaoExternalAdminFactory; pub use cw721_roles::DaoExternalCw721Roles; @@ -13,3 +14,4 @@ pub use migrator::DaoExternalMigrator; pub use payroll_factory::DaoExternalPayrollFactory; pub use token_swap::DaoExternalTokenSwap; pub use tokenfactory_issuer::DaoExternalTokenfactoryIssuer; +pub use btsg_ft_factory::DaoExternalFantokenFactory; diff --git a/scripts/src/dao.rs b/scripts/src/dao.rs index be6751cef..ba1c68268 100644 --- a/scripts/src/dao.rs +++ b/scripts/src/dao.rs @@ -29,135 +29,3 @@ impl DaoDao { Ok(()) } } - -// admin factory -pub struct AdminFactorySuite { - pub factory: DaoExternalAdminFactory, -} -impl AdminFactorySuite { - pub fn new(chain: Chain) -> AdminFactorySuite { - AdminFactorySuite:: { - factory: DaoExternalAdminFactory::new("cw_admin_factory", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.factory.upload()?; - - Ok(()) - } -} - -// payroll factory -pub struct PayrollSuite { - pub payroll: DaoExternalPayrollFactory, - pub vesting: DaoExternalCwVesting, -} -impl PayrollSuite { - pub fn new(chain: Chain) -> PayrollSuite { - PayrollSuite:: { - payroll: DaoExternalPayrollFactory::new("cw_payroll", chain.clone()), - vesting: DaoExternalCwVesting::new("cw_vesting", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.payroll.upload()?; - self.vesting.upload()?; - Ok(()) - } -} - -// cw tokenswap -pub struct TokenSwapSuite { - pub tokenswap: DaoExternalTokenSwap, -} -impl TokenSwapSuite { - pub fn new(chain: Chain) -> TokenSwapSuite { - TokenSwapSuite:: { - tokenswap: DaoExternalTokenSwap::new("cw_tokenswap", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.tokenswap.upload()?; - - Ok(()) - } -} - -// cw-tokenfactory issuer -pub struct TokenFactorySuite { - pub tokenfactory: DaoExternalTokenfactoryIssuer, -} -impl TokenFactorySuite { - pub fn new(chain: Chain) -> TokenFactorySuite { - TokenFactorySuite:: { - tokenfactory: DaoExternalTokenfactoryIssuer::new("cw_tokenfactory", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.tokenfactory.upload()?; - - Ok(()) - } -} - -// cw-vesting -pub struct VestingSuite { - pub vesting: DaoExternalCwVesting, -} - -impl VestingSuite { - pub fn new(chain: Chain) -> VestingSuite { - VestingSuite:: { - vesting: DaoExternalCwVesting::new("dao_dao_core", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.vesting.upload()?; - - Ok(()) - } -} - -// cw721 roles - -pub struct Cw721RolesSuite { - pub roles: DaoExternalCw721Roles, -} - -impl Cw721RolesSuite { - pub fn new(chain: Chain) -> Cw721RolesSuite { - Cw721RolesSuite:: { - roles: DaoExternalCw721Roles::new("cw721_roles", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.roles.upload()?; - - Ok(()) - } -} - -// migrator -pub struct DaoMigrationSuite { - pub migrator: DaoExternalMigrator, -} - -impl DaoMigrationSuite { - pub fn new(chain: Chain) -> DaoMigrationSuite { - DaoMigrationSuite:: { - migrator: DaoExternalMigrator::new("dao_migrator", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.migrator.upload()?; - - Ok(()) - } -} diff --git a/scripts/src/external.rs b/scripts/src/external.rs new file mode 100644 index 000000000..4fdf5a495 --- /dev/null +++ b/scripts/src/external.rs @@ -0,0 +1,152 @@ +use cw_orch::prelude::*; +use dao_cw_orch::*; + +// admin factory +pub struct AdminFactorySuite { + pub factory: DaoExternalAdminFactory, +} +impl AdminFactorySuite { + pub fn new(chain: Chain) -> AdminFactorySuite { + AdminFactorySuite:: { + factory: DaoExternalAdminFactory::new("cw_admin_factory", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.factory.upload()?; + + Ok(()) + } +} + +// bitsong fantoken factory +pub struct FantokenFactorySuite { + pub factory: DaoExternalFantokenFactory, +} + +impl DaoExternalFantokenFactory { + pub fn new(chain: Chain) -> DaoExternalFantokenFactory { + DaoExternalFantokenFactory:: { + factory: DaoExternalFantokenFactory::new("btsg_ft_factory", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.factory.upload()?; + + Ok(()) + } +} + +// payroll factory +pub struct PayrollSuite { + pub payroll: DaoExternalPayrollFactory, + pub vesting: DaoExternalCwVesting, +} +impl PayrollSuite { + pub fn new(chain: Chain) -> PayrollSuite { + PayrollSuite:: { + payroll: DaoExternalPayrollFactory::new("cw_payroll", chain.clone()), + vesting: DaoExternalCwVesting::new("cw_vesting", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.payroll.upload()?; + self.vesting.upload()?; + Ok(()) + } +} + +// cw tokenswap +pub struct TokenSwapSuite { + pub tokenswap: DaoExternalTokenSwap, +} +impl TokenSwapSuite { + pub fn new(chain: Chain) -> TokenSwapSuite { + TokenSwapSuite:: { + tokenswap: DaoExternalTokenSwap::new("cw_tokenswap", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.tokenswap.upload()?; + + Ok(()) + } +} + +// cw-tokenfactory issuer +pub struct TokenFactorySuite { + pub tokenfactory: DaoExternalTokenfactoryIssuer, +} +impl TokenFactorySuite { + pub fn new(chain: Chain) -> TokenFactorySuite { + TokenFactorySuite:: { + tokenfactory: DaoExternalTokenfactoryIssuer::new("cw_tokenfactory", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.tokenfactory.upload()?; + + Ok(()) + } +} + +// cw-vesting +pub struct VestingSuite { + pub vesting: DaoExternalCwVesting, +} + +impl VestingSuite { + pub fn new(chain: Chain) -> VestingSuite { + VestingSuite:: { + vesting: DaoExternalCwVesting::new("dao_dao_core", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.vesting.upload()?; + + Ok(()) + } +} + +// cw721 roles +pub struct Cw721RolesSuite { + pub roles: DaoExternalCw721Roles, +} + +impl Cw721RolesSuite { + pub fn new(chain: Chain) -> Cw721RolesSuite { + Cw721RolesSuite:: { + roles: DaoExternalCw721Roles::new("cw721_roles", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.roles.upload()?; + + Ok(()) + } +} + +// migrator +pub struct DaoMigrationSuite { + pub migrator: DaoExternalMigrator, +} + +impl DaoMigrationSuite { + pub fn new(chain: Chain) -> DaoMigrationSuite { + DaoMigrationSuite:: { + migrator: DaoExternalMigrator::new("dao_migrator", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.migrator.upload()?; + + Ok(()) + } +} diff --git a/scripts/src/lib.rs b/scripts/src/lib.rs index 144b8025d..ecbdd8053 100644 --- a/scripts/src/lib.rs +++ b/scripts/src/lib.rs @@ -2,9 +2,9 @@ fn main() {} mod dao; +mod external; pub use dao::*; +pub use external::*; #[cfg(test)] -mod deploy; -#[cfg(test)] -mod tests; +mod tests; \ No newline at end of file diff --git a/scripts/src/deploy/external.rs b/scripts/src/tests/deploy/external.rs similarity index 84% rename from scripts/src/deploy/external.rs rename to scripts/src/tests/deploy/external.rs index b344a5aa9..698593310 100644 --- a/scripts/src/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -1,4 +1,4 @@ -use crate::dao::*; +use crate::external::*; use cw_orch::prelude::*; use cw_tokenfactory_issuer::msg::InstantiateMsg as TokenfactoryIssuerInit; @@ -104,8 +104,8 @@ impl cw_orch::contract::Deploy for TokenSwapSuite { } fn load_from(chain: Chain) -> Result { - let payroll = Self::new(chain.clone()); - Ok(payroll) + let tokenswap = Self::new(chain.clone()); + Ok(tokenswap) } fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { @@ -173,8 +173,8 @@ impl cw_orch::contract::Deploy for VestingSuite { } fn load_from(chain: Chain) -> Result { - let factory = Self::new(chain.clone()); - Ok(factory) + let vesting = Self::new(chain.clone()); + Ok(vesting) } fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { @@ -216,6 +216,7 @@ impl cw_orch::contract::Deploy for Cw721RolesSuite { Ok(suite) } } + // dao-migrator impl cw_orch::contract::Deploy for DaoMigrationSuite { // We don't have a custom error type @@ -223,9 +224,9 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite type DeployData = Addr; fn store_on(chain: Chain) -> Result { - let roles = DaoMigrationSuite::new(chain.clone()); - roles.upload()?; - Ok(roles) + let migrator = DaoMigrationSuite::new(chain.clone()); + migrator.upload()?; + Ok(migrator) } fn deployed_state_file_path() -> Option { @@ -237,8 +238,8 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite } fn load_from(chain: Chain) -> Result { - let roles = Self::new(chain.clone()); - Ok(roles) + let migrator = Self::new(chain.clone()); + Ok(migrator) } fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { @@ -249,3 +250,38 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite Ok(suite) } } + +// bitsong +impl cw_orch::contract::Deploy for FantokenFactorySuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let factory = FantokenFactorySuite::new(chain.clone()); + factory.upload()?; + Ok(factory) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.factory)] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: FantokenFactorySuite = + FantokenFactorySuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + + Ok(suite) + } +} diff --git a/scripts/src/deploy/mod.rs b/scripts/src/tests/deploy/mod.rs similarity index 100% rename from scripts/src/deploy/mod.rs rename to scripts/src/tests/deploy/mod.rs diff --git a/scripts/src/tests/external/admin_factory.rs b/scripts/src/tests/external/admin_factory.rs index b5f64c102..b75750ed6 100644 --- a/scripts/src/tests/external/admin_factory.rs +++ b/scripts/src/tests/external/admin_factory.rs @@ -1,7 +1,7 @@ use cw_orch::{anyhow, prelude::*}; use crate::{ - dao::AdminFactorySuite, + external::AdminFactorySuite, tests::{ADMIN, PREFIX}, }; diff --git a/scripts/src/tests/external/btsg_ft_factory.rs b/scripts/src/tests/external/btsg_ft_factory.rs new file mode 100644 index 000000000..b75750ed6 --- /dev/null +++ b/scripts/src/tests/external/btsg_ft_factory.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + external::AdminFactorySuite, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_admin() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/mod.rs b/scripts/src/tests/external/mod.rs index 890d1f1b7..0cd1957fa 100644 --- a/scripts/src/tests/external/mod.rs +++ b/scripts/src/tests/external/mod.rs @@ -5,3 +5,4 @@ pub mod token_swap; pub mod tokenfactory_issuer; pub mod vesting; pub mod dao_migration; +pub mod btsg_ft_factory; diff --git a/scripts/src/tests/external/payroll.rs b/scripts/src/tests/external/payroll.rs index 3bb7947f4..eea003b1a 100644 --- a/scripts/src/tests/external/payroll.rs +++ b/scripts/src/tests/external/payroll.rs @@ -1,7 +1,7 @@ use cw_orch::{anyhow, prelude::*}; use crate::{ - dao::PayrollSuite, + external::PayrollSuite, tests::{ADMIN, PREFIX}, }; diff --git a/scripts/src/tests/external/token_swap.rs b/scripts/src/tests/external/token_swap.rs index f88f0f6b6..25a6b4dc2 100644 --- a/scripts/src/tests/external/token_swap.rs +++ b/scripts/src/tests/external/token_swap.rs @@ -2,7 +2,7 @@ use cw_orch::{anyhow, prelude::*}; use cw_token_swap::msg::{Counterparty, InstantiateMsg, TokenInfo}; use crate::{ - dao::TokenSwapSuite, + external::TokenSwapSuite, tests::{ADMIN, DAO1, DENOM, PREFIX}, }; #[test] diff --git a/scripts/src/tests/external/tokenfactory_issuer.rs b/scripts/src/tests/external/tokenfactory_issuer.rs index 16df53d1a..30c518986 100644 --- a/scripts/src/tests/external/tokenfactory_issuer.rs +++ b/scripts/src/tests/external/tokenfactory_issuer.rs @@ -1,7 +1,7 @@ use cw_orch::{anyhow, prelude::*}; use crate::{ - dao::TokenFactorySuite, + external::TokenFactorySuite, tests::{ADMIN, PREFIX}, }; diff --git a/scripts/src/tests/external/vesting.rs b/scripts/src/tests/external/vesting.rs index 85a7e1b6e..2ef501b47 100644 --- a/scripts/src/tests/external/vesting.rs +++ b/scripts/src/tests/external/vesting.rs @@ -1,7 +1,7 @@ use cw_orch::{anyhow, prelude::*}; use crate::{ - dao::TokenFactorySuite, + external::TokenFactorySuite, tests::{ADMIN, PREFIX}, VestingSuite, }; diff --git a/scripts/src/tests/mod.rs b/scripts/src/tests/mod.rs index db6082a45..bb2375cef 100644 --- a/scripts/src/tests/mod.rs +++ b/scripts/src/tests/mod.rs @@ -1,7 +1,7 @@ mod external; +mod deploy; pub(crate) const PREFIX: &str = "mock"; pub(crate) const ADMIN: &str = "admin"; pub(crate) const DENOM: &str = "juno"; - pub(crate) const DAO1: &str = "dao1"; From f2570de2a9a1a461de417418e001dea808fcf08c Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 21:37:15 +0000 Subject: [PATCH 26/50] correct import --- Cargo.lock | 1 + scripts/Cargo.toml | 3 ++- scripts/src/external.rs | 6 +++--- scripts/src/tests/deploy/external.rs | 5 ++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0ca69347..4f3d4a8df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6325,6 +6325,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" name = "scripts" version = "2.5.0" dependencies = [ + "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "cw-orch 0.24.1", "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index b2ce8e0b6..5266c6025 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -31,4 +31,5 @@ cw-admin-factory = { git = "https://github.com/hard-nett/dao-contracts", cw-tokenfactory-issuer = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } cw-vesting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } cw721-roles = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file +dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } +btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file diff --git a/scripts/src/external.rs b/scripts/src/external.rs index 4fdf5a495..a6331b0b9 100644 --- a/scripts/src/external.rs +++ b/scripts/src/external.rs @@ -24,9 +24,9 @@ pub struct FantokenFactorySuite { pub factory: DaoExternalFantokenFactory, } -impl DaoExternalFantokenFactory { - pub fn new(chain: Chain) -> DaoExternalFantokenFactory { - DaoExternalFantokenFactory:: { +impl FantokenFactorySuite { + pub fn new(chain: Chain) -> FantokenFactorySuite { + FantokenFactorySuite:: { factory: DaoExternalFantokenFactory::new("btsg_ft_factory", chain.clone()), } } diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 698593310..ce7a6bb33 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -251,7 +251,7 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite } } -// bitsong +// bitsong fantoken factory impl cw_orch::contract::Deploy for FantokenFactorySuite { // We don't have a custom error type type Error = CwOrchError; @@ -281,6 +281,9 @@ impl cw_orch::contract::Deploy for FantokenFactorySuite = FantokenFactorySuite::store_on(chain.clone()).unwrap(); // ########### Instantiate ############## + suite + .factory + .instantiate(&btsg_ft_factory::msg::InstantiateMsg {}, None, None)?; Ok(suite) } From bf0b66872264d15b304e55eaa7cec0ef2871ed49 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 22:47:45 +0000 Subject: [PATCH 27/50] bump correct init --- Cargo.lock | 37 +++++++++++++++++++++++++++- scripts/Cargo.toml | 2 +- scripts/src/tests/deploy/external.rs | 3 +-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f3d4a8df..00018937b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -704,6 +704,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "btsg-ft-factory" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb#1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb)", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -3040,6 +3060,21 @@ dependencies = [ "osmosis-std", ] +[[package]] +name = "dao-interface" +version = "2.5.0" +source = "git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb#1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch 0.24.1", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + [[package]] name = "dao-migrator" version = "2.5.0" @@ -6325,7 +6360,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" name = "scripts" version = "2.5.0" dependencies = [ - "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb)", "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "cw-orch 0.24.1", "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 5266c6025..19b5d05d8 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -32,4 +32,4 @@ cw-tokenfactory-issuer = { git = "https://github.com/hard-nett/dao-contracts", cw-vesting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } cw721-roles = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file +btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", rev = "1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" } \ No newline at end of file diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index ce7a6bb33..78bbe9f5b 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -283,8 +283,7 @@ impl cw_orch::contract::Deploy for FantokenFactorySuite Date: Tue, 23 Jul 2024 23:06:45 +0000 Subject: [PATCH 28/50] bump --- Cargo.lock | 37 +--------- .../cw-orch/src/external/btsg_ft_factory.rs | 4 +- scripts/Cargo.toml | 2 +- scripts/src/tests/deploy/external.rs | 69 +++++++++---------- 4 files changed, 38 insertions(+), 74 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00018937b..4f3d4a8df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -704,26 +704,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "btsg-ft-factory" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb#1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb)", - "osmosis-std-derive", - "prost 0.12.3", - "prost-derive 0.12.3", - "prost-types 0.12.3", - "schemars", - "serde", - "thiserror", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -3060,21 +3040,6 @@ dependencies = [ "osmosis-std", ] -[[package]] -name = "dao-interface" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb#1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw721 0.18.0", - "osmosis-std", -] - [[package]] name = "dao-migrator" version = "2.5.0" @@ -6360,7 +6325,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" name = "scripts" version = "2.5.0" dependencies = [ - "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?rev=1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb)", + "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", "cw-orch 0.24.1", "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", diff --git a/packages/cw-orch/src/external/btsg_ft_factory.rs b/packages/cw-orch/src/external/btsg_ft_factory.rs index 22b6aba3e..d3c29c6b9 100644 --- a/packages/cw-orch/src/external/btsg_ft_factory.rs +++ b/packages/cw-orch/src/external/btsg_ft_factory.rs @@ -1,7 +1,7 @@ use cw_orch::{interface, prelude::*}; -use cw_payroll_factory::contract::{execute, instantiate, query, reply}; -use cw_payroll_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use btsg_ft_factory::contract::{execute, instantiate, query, reply}; +use btsg_ft_factory::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct DaoExternalFantokenFactory; diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 19b5d05d8..5266c6025 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -32,4 +32,4 @@ cw-tokenfactory-issuer = { git = "https://github.com/hard-nett/dao-contracts", cw-vesting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } cw721-roles = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", rev = "1b1849e1aa41d8cb6a2b6b05db6dae032719b9bb" } \ No newline at end of file +btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 78bbe9f5b..3300cd86b 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -1,4 +1,5 @@ use crate::external::*; +use btsg_ft_factory::msg::InstantiateMsg; use cw_orch::prelude::*; use cw_tokenfactory_issuer::msg::InstantiateMsg as TokenfactoryIssuerInit; @@ -252,38 +253,36 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite } // bitsong fantoken factory -impl cw_orch::contract::Deploy for FantokenFactorySuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let factory = FantokenFactorySuite::new(chain.clone()); - factory.upload()?; - Ok(factory) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.factory)] - } - - fn load_from(chain: Chain) -> Result { - let factory = Self::new(chain.clone()); - Ok(factory) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: FantokenFactorySuite = - FantokenFactorySuite::store_on(chain.clone()).unwrap(); - // ########### Instantiate ############## - suite - .factory - .instantiate(&btsg_ft_factory::msg::InstantiateMsg {}, None, None); - Ok(suite) - } -} +// impl cw_orch::contract::Deploy for FantokenFactorySuite { +// // We don't have a custom error type +// type Error = CwOrchError; +// type DeployData = Addr; + +// fn store_on(chain: Chain) -> Result { +// let factory = FantokenFactorySuite::new(chain.clone()); +// factory.upload()?; +// Ok(factory) +// } + +// fn deployed_state_file_path() -> Option { +// None +// } + +// fn get_contracts_mut(&mut self) -> Vec>> { +// vec![Box::new(&mut self.factory)] +// } + +// fn load_from(chain: Chain) -> Result { +// let factory = Self::new(chain.clone()); +// Ok(factory) +// } + +// fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { +// // ########### Upload ############## +// let suite: FantokenFactorySuite = +// FantokenFactorySuite::store_on(chain.clone()).unwrap(); +// // ########### Instantiate ############## +// suite.factory.instantiate(&InstantiateMsg {}, None, None); +// Ok(suite) +// } +// } From 776ebe3fae3fcd87c393eb7249dd0b91c46ecf76 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 23:08:05 +0000 Subject: [PATCH 29/50] good btsg cw-orch bump --- scripts/src/tests/deploy/external.rs | 66 ++++++++++++++-------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 3300cd86b..8e77267fe 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -253,36 +253,36 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite } // bitsong fantoken factory -// impl cw_orch::contract::Deploy for FantokenFactorySuite { -// // We don't have a custom error type -// type Error = CwOrchError; -// type DeployData = Addr; - -// fn store_on(chain: Chain) -> Result { -// let factory = FantokenFactorySuite::new(chain.clone()); -// factory.upload()?; -// Ok(factory) -// } - -// fn deployed_state_file_path() -> Option { -// None -// } - -// fn get_contracts_mut(&mut self) -> Vec>> { -// vec![Box::new(&mut self.factory)] -// } - -// fn load_from(chain: Chain) -> Result { -// let factory = Self::new(chain.clone()); -// Ok(factory) -// } - -// fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { -// // ########### Upload ############## -// let suite: FantokenFactorySuite = -// FantokenFactorySuite::store_on(chain.clone()).unwrap(); -// // ########### Instantiate ############## -// suite.factory.instantiate(&InstantiateMsg {}, None, None); -// Ok(suite) -// } -// } +impl cw_orch::contract::Deploy for FantokenFactorySuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let factory = FantokenFactorySuite::new(chain.clone()); + factory.upload()?; + Ok(factory) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![Box::new(&mut self.factory)] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: FantokenFactorySuite = + FantokenFactorySuite::store_on(chain.clone()).unwrap(); + // ########### Instantiate ############## + suite.factory.instantiate(&InstantiateMsg {}, None, None)?; + Ok(suite) + } +} From 0bb200e90c2c6c158f0e4285f2db9731aec14a78 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Tue, 23 Jul 2024 23:28:10 +0000 Subject: [PATCH 30/50] cleanup script imports --- Cargo.lock | 1149 +++++--------------------------------------- Cargo.toml | 3 + scripts/Cargo.toml | 36 +- scripts/src/dao.rs | 6 +- 4 files changed, 128 insertions(+), 1066 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f3d4a8df..ecaed6ba6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -623,7 +623,7 @@ dependencies = [ "anyhow", "cosm-orc", "cosmwasm-std", - "cw-admin-factory 2.5.0", + "cw-admin-factory", "cw-utils 1.0.3", "cw20 1.1.2", "cw20-stake 2.5.0", @@ -632,7 +632,7 @@ dependencies = [ "dao-pre-propose-single 2.5.0", "dao-proposal-single 2.5.0", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "env_logger", "serde", "serde_json", @@ -674,27 +674,7 @@ dependencies = [ "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-token-staked 2.5.0", - "osmosis-std-derive", - "prost 0.12.3", - "prost-derive 0.12.3", - "prost-types 0.12.3", - "schemars", - "serde", - "thiserror", -] - -[[package]] -name = "btsg-ft-factory" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-token-staked", "osmosis-std-derive", "prost 0.12.3", "prost-derive 0.12.3", @@ -1186,7 +1166,7 @@ dependencies = [ "bech32 0.9.1", "cosmwasm-schema", "cosmwasm-std", - "cw-admin-factory 2.5.0", + "cw-admin-factory", "cw-multi-test", "cw-orch 0.24.1", "cw-storage-plus 1.2.0", @@ -1204,20 +1184,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-admin-factory" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "thiserror", -] - [[package]] name = "cw-controllers" version = "0.11.1" @@ -1340,17 +1306,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-denom" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw20 1.1.2", - "thiserror", -] - [[package]] name = "cw-denom" version = "2.5.0" @@ -1363,17 +1318,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-denom" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw20 1.1.2", - "thiserror", -] - [[package]] name = "cw-fund-distributor" version = "2.5.0" @@ -1391,26 +1335,7 @@ dependencies = [ "cw20-stake 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", - "dao-voting-cw20-staked 2.5.0", - "thiserror", -] - -[[package]] -name = "cw-fund-distributor" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-staked", "thiserror", ] @@ -1437,17 +1362,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-hooks" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "thiserror", -] - [[package]] name = "cw-hooks" version = "2.5.0" @@ -1458,17 +1372,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-hooks" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "thiserror", -] - [[package]] name = "cw-multi-test" version = "0.20.1" @@ -1754,16 +1657,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cw-paginate-storage" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "serde", -] - [[package]] name = "cw-payroll-factory" version = "2.5.0" @@ -1776,7 +1669,7 @@ dependencies = [ "cw-ownable", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw-vesting 2.5.0", + "cw-vesting", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -1784,24 +1677,6 @@ dependencies = [ "wynd-utils", ] -[[package]] -name = "cw-payroll-factory" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw2 1.1.2", - "cw20 1.1.2", - "thiserror", -] - [[package]] name = "cw-proposal-single" version = "0.1.0" @@ -1833,17 +1708,7 @@ version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-wormhole 2.5.0", -] - -[[package]] -name = "cw-stake-tracker" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-wormhole 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-wormhole", ] [[package]] @@ -1906,21 +1771,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-token-swap" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "thiserror", -] - [[package]] name = "cw-tokenfactory-issuer" version = "2.5.0" @@ -1931,7 +1781,7 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-types 2.5.0", + "cw-tokenfactory-types", "cw2 1.1.2", "dao-interface 2.5.0", "osmosis-std", @@ -1944,27 +1794,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-tokenfactory-issuer" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-tokenfactory-types 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "osmosis-std", - "prost 0.12.3", - "prost-derive 0.12.3", - "schemars", - "serde", - "thiserror", -] - [[package]] name = "cw-tokenfactory-types" version = "2.5.0" @@ -1982,24 +1811,6 @@ dependencies = [ "serde-cw-value", ] -[[package]] -name = "cw-tokenfactory-types" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "osmosis-std", - "osmosis-std-derive", - "prost 0.12.3", - "prost-derive 0.12.3", - "prost-types 0.12.3", - "schemars", - "serde", - "serde-cw-value", -] - [[package]] name = "cw-utils" version = "0.11.1" @@ -2065,10 +1876,10 @@ dependencies = [ "cw-multi-test", "cw-orch 0.24.1", "cw-ownable", - "cw-stake-tracker 2.5.0", + "cw-stake-tracker", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", - "cw-wormhole 2.5.0", + "cw-wormhole", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -2078,27 +1889,6 @@ dependencies = [ "wynd-utils", ] -[[package]] -name = "cw-vesting" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-ownable", - "cw-stake-tracker 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw-wormhole 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw2 1.1.2", - "cw20 1.1.2", - "serde", - "thiserror", - "wynd-utils", -] - [[package]] name = "cw-wormhole" version = "2.5.0" @@ -2109,17 +1899,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cw-wormhole" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "serde", -] - [[package]] name = "cw2" version = "0.11.1" @@ -2334,30 +2113,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw20-stake" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-ownable", - "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw-utils 0.13.4", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw20-stake 0.2.6", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "cw20-stake-external-rewards" version = "2.5.0" @@ -2381,28 +2136,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw20-stake-external-rewards" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 0.13.4", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "stake-cw20-external-rewards", - "thiserror", -] - [[package]] name = "cw20-stake-reward-distributor" version = "2.5.0" @@ -2422,25 +2155,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw20-stake-reward-distributor" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "stake-cw20-reward-distributor", - "thiserror", -] - [[package]] name = "cw20-staked-balance-voting" version = "0.1.0" @@ -2638,18 +2352,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw721-controllers" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "thiserror", -] - [[package]] name = "cw721-roles" version = "2.5.0" @@ -2666,30 +2368,9 @@ dependencies = [ "cw4 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-cw721-extensions 2.5.0", + "dao-cw721-extensions", "dao-testing", - "dao-voting-cw721-staked 2.5.0", - "serde", - "thiserror", -] - -[[package]] -name = "cw721-roles" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw4 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", - "dao-cw721-extensions 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw721-staked", "serde", "thiserror", ] @@ -2698,82 +2379,40 @@ dependencies = [ name = "dao-cw-orch" version = "2.5.0" dependencies = [ - "btsg-ft-factory 2.5.0", + "btsg-ft-factory", "cosmwasm-std", - "cw-admin-factory 2.5.0", - "cw-fund-distributor 2.5.0", + "cw-admin-factory", + "cw-fund-distributor", "cw-orch 0.24.1", - "cw-payroll-factory 2.5.0", - "cw-token-swap 2.5.0", - "cw-tokenfactory-issuer 2.5.0", - "cw-vesting 2.5.0", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", "cw20-stake 2.5.0", - "cw20-stake-external-rewards 2.5.0", - "cw20-stake-reward-distributor 2.5.0", + "cw20-stake-external-rewards", + "cw20-stake-reward-distributor", "cw721-base 0.18.0", - "cw721-roles 2.5.0", + "cw721-roles", "dao-dao-core 2.5.0", "dao-interface 2.5.0", - "dao-migrator 2.5.0", + "dao-migrator", "dao-pre-propose-approval-single 2.5.0", - "dao-pre-propose-approver 2.5.0", + "dao-pre-propose-approver", "dao-pre-propose-multiple 2.5.0", "dao-pre-propose-single 2.5.0", - "dao-proposal-condorcet 2.5.0", - "dao-proposal-hook-counter 2.5.0", + "dao-proposal-condorcet", + "dao-proposal-hook-counter", "dao-proposal-multiple 2.5.0", "dao-proposal-single 2.5.0", - "dao-proposal-sudo 2.5.0", - "dao-rewards-distributor 2.5.0", - "dao-test-custom-factory 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-proposal-sudo", + "dao-rewards-distributor", + "dao-test-custom-factory", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-roles 2.5.0", - "dao-voting-cw721-staked 2.5.0", - "dao-voting-token-staked 2.5.0", - "serde", -] - -[[package]] -name = "dao-cw-orch" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cosmwasm-std", - "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-fund-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-token-swap 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw20-stake-external-rewards 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw20-stake-reward-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw721-base 0.18.0", - "cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-dao-core 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-migrator 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-approval-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-approver 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-condorcet 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-hook-counter 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-sudo 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-rewards-distributor 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-test-custom-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw20-balance 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw4 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw721-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-token-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw721-roles", + "dao-voting-cw721-staked", + "dao-voting-token-staked", "serde", ] @@ -2788,18 +2427,6 @@ dependencies = [ "cw4 1.1.2", ] -[[package]] -name = "dao-cw721-extensions" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-orch 0.24.1", - "cw4 1.1.2", -] - [[package]] name = "dao-dao-core" version = "2.4.1" @@ -2815,7 +2442,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw721 0.18.0", - "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dao-dao-macros 2.4.2", "dao-interface 2.4.1", "thiserror", ] @@ -2840,30 +2467,11 @@ dependencies = [ "cw20-base 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-cw-orch 2.5.0", + "dao-cw-orch", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", - "dao-proposal-sudo 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "thiserror", -] - -[[package]] -name = "dao-dao-core" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-core", - "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw721 0.18.0", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-proposal-sudo", + "dao-voting-cw20-balance", "thiserror", ] @@ -2879,17 +2487,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "dao-dao-macros" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "dao-dao-macros" version = "2.5.0" @@ -2904,17 +2501,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "dao-dao-macros" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "dao-hooks" version = "2.4.1" @@ -2923,25 +2509,12 @@ checksum = "8c85abbadefe491d571f709464a8cfd2fb78b63b0cb6e6ef49104df249e28acc" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-hooks 2.4.2", "cw4 1.1.2", "dao-pre-propose-base 2.4.1", "dao-voting 2.4.1", ] -[[package]] -name = "dao-hooks" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "cw4 1.1.2", - "dao-pre-propose-base 2.4.2", - "dao-voting 2.4.2", -] - [[package]] name = "dao-hooks" version = "2.5.0" @@ -2954,19 +2527,6 @@ dependencies = [ "dao-voting 2.5.0", ] -[[package]] -name = "dao-hooks" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw4 1.1.2", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", -] - [[package]] name = "dao-interface" version = "2.2.0" @@ -2996,39 +2556,9 @@ dependencies = [ "osmosis-std", ] -[[package]] -name = "dao-interface" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.22.2", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw721 0.18.0", - "osmosis-std", -] - -[[package]] -name = "dao-interface" -version = "2.5.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw721 0.18.0", - "osmosis-std", -] - [[package]] name = "dao-interface" version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -3070,44 +2600,11 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", "thiserror", ] -[[package]] -name = "dao-migrator" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-core", - "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", - "cw-orch 0.24.1", - "cw-proposal-single", - "cw-storage-plus 1.2.0", - "cw-utils 0.13.4", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 0.13.4", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw20-stake 0.2.6", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw20-staked-balance-voting", - "cw4 0.13.4", - "cw4-voting", - "dao-dao-core 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 0.1.0", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw20-staked 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting-cw4 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-pre-propose-approval-single" version = "2.4.1" @@ -3153,28 +2650,12 @@ dependencies = [ "dao-testing", "dao-voting 2.4.1", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", "thiserror", ] -[[package]] -name = "dao-pre-propose-approval-single" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-paginate-storage 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-pre-propose-approver" version = "2.5.0" @@ -3197,26 +2678,10 @@ dependencies = [ "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", ] -[[package]] -name = "dao-pre-propose-approver" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-approval-single 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", -] - [[package]] name = "dao-pre-propose-base" version = "2.4.1" @@ -3226,7 +2691,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-denom 2.4.1", - "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-hooks 2.4.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -3236,25 +2701,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-pre-propose-base" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.4.2", - "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "cw-orch 0.22.2", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "dao-interface 2.4.2", - "dao-voting 2.4.2", - "serde", - "thiserror", -] - [[package]] name = "dao-pre-propose-base" version = "2.5.0" @@ -3278,29 +2724,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-pre-propose-base" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.4.1", - "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-base 2.4.1", - "dao-voting 2.4.1", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "semver", - "serde", - "thiserror", -] - [[package]] name = "dao-pre-propose-multiple" version = "2.4.1" @@ -3340,23 +2763,11 @@ dependencies = [ "dao-testing", "dao-voting 2.4.1", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", ] -[[package]] -name = "dao-pre-propose-multiple" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 1.1.2", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", -] - [[package]] name = "dao-pre-propose-single" version = "2.4.1" @@ -3395,23 +2806,11 @@ dependencies = [ "dao-proposal-single 2.4.1", "dao-proposal-single 2.5.0", "dao-testing", - "dao-voting 2.4.1", - "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", - "dao-voting-cw4 2.4.1", - "dao-voting-cw4 2.5.0", -] - -[[package]] -name = "dao-pre-propose-single" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2 1.1.2", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting 2.4.1", + "dao-voting 2.5.0", + "dao-voting-cw20-staked", + "dao-voting-cw4 2.4.1", + "dao-voting-cw4 2.5.0", ] [[package]] @@ -3437,23 +2836,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-proposal-condorcet" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-proposal-hook-counter" version = "2.5.0" @@ -3473,21 +2855,7 @@ dependencies = [ "dao-interface 2.5.0", "dao-proposal-single 2.5.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "thiserror", -] - -[[package]] -name = "dao-proposal-hook-counter" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-voting-cw20-balance", "thiserror", ] @@ -3499,12 +2867,12 @@ checksum = "51fac47816150063ef09b555f3466f8be99612b76860a20fba7c85bd1854beba" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-hooks 2.4.2", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", - "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dao-dao-macros 2.4.2", "dao-hooks 2.4.1", "dao-interface 2.4.1", "dao-pre-propose-base 2.4.1", @@ -3542,38 +2910,15 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked 2.5.0", - "dao-voting-token-staked 2.5.0", + "dao-voting-cw721-staked", + "dao-voting-token-staked", "rand", "thiserror", ] -[[package]] -name = "dao-proposal-multiple" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-multiple 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 0.1.0", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-proposal-single" version = "2.4.1" @@ -3582,14 +2927,14 @@ checksum = "2ce91710cfcff1af520cd0e885eee6972aeefbefc1c9da18349e66ab959269bb" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-hooks 2.4.2", "cw-proposal-single", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", - "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dao-dao-macros 2.4.2", "dao-hooks 2.4.1", "dao-interface 2.4.1", "dao-pre-propose-base 2.4.1", @@ -3598,30 +2943,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-proposal-single" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "cw-orch 0.22.2", - "cw-proposal-single", - "cw-storage-plus 1.2.0", - "cw-utils 0.13.4", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "dao-hooks 2.4.2", - "dao-interface 2.4.2", - "dao-pre-propose-base 2.4.2", - "dao-voting 0.1.0", - "dao-voting 2.4.2", - "thiserror", -] - [[package]] name = "dao-proposal-single" version = "2.5.0" @@ -3654,50 +2975,11 @@ dependencies = [ "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked 2.5.0", - "dao-voting-token-staked 2.5.0", - "thiserror", -] - -[[package]] -name = "dao-proposal-single" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-proposal-single", - "cw-storage-plus 1.2.0", - "cw-utils 0.13.4", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-pre-propose-base 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 0.1.0", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - -[[package]] -name = "dao-proposal-sudo" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.22.2", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "dao-interface 2.4.2", + "dao-voting-cw721-staked", + "dao-voting-token-staked", "thiserror", ] @@ -3716,21 +2998,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-proposal-sudo" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw2 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-rewards-distributor" version = "2.5.0" @@ -3755,36 +3022,14 @@ dependencies = [ "dao-interface 2.5.0", "dao-testing", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-staked 2.5.0", - "dao-voting-token-staked 2.5.0", + "dao-voting-cw721-staked", + "dao-voting-token-staked", "semver", "thiserror", ] -[[package]] -name = "dao-rewards-distributor" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw4 1.1.2", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-test-custom-factory" version = "2.5.0" @@ -3795,7 +3040,7 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer 2.5.0", + "cw-tokenfactory-issuer", "cw-utils 1.0.3", "cw2 1.1.2", "cw721 0.18.0", @@ -3806,41 +3051,20 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-test-custom-factory" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-testing" version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-admin-factory 2.5.0", + "cw-admin-factory", "cw-core", "cw-hooks 2.5.0", "cw-multi-test", "cw-proposal-single", - "cw-tokenfactory-issuer 2.5.0", + "cw-tokenfactory-issuer", "cw-utils 1.0.3", - "cw-vesting 2.5.0", + "cw-vesting", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", @@ -3848,23 +3072,23 @@ dependencies = [ "cw4 1.1.2", "cw4-group 1.1.2", "cw721-base 0.18.0", - "cw721-roles 2.5.0", + "cw721-roles", "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-pre-propose-multiple 2.5.0", "dao-pre-propose-single 2.5.0", - "dao-proposal-condorcet 2.5.0", + "dao-proposal-condorcet", "dao-proposal-single 2.5.0", - "dao-test-custom-factory 2.5.0", + "dao-test-custom-factory", "dao-voting 0.1.0", "dao-voting 2.5.0", - "dao-voting-cw20-balance 2.5.0", - "dao-voting-cw20-staked 2.5.0", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", "dao-voting-cw4 2.5.0", - "dao-voting-cw721-roles 2.5.0", - "dao-voting-cw721-staked 2.5.0", + "dao-voting-cw721-roles", + "dao-voting-cw721-staked", "dao-voting-onft-staked", - "dao-voting-token-staked 2.5.0", + "dao-voting-token-staked", "osmosis-std", "osmosis-test-tube", "rand", @@ -3897,27 +3121,11 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw20 1.1.2", - "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dao-dao-macros 2.4.2", "dao-interface 2.4.1", "thiserror", ] -[[package]] -name = "dao-voting" -version = "2.4.2" -source = "git+https://github.com/Kayanski/dao-contracts?branch=development#8c945acdb0746ec84d15cfebeadcfe32122f85a2" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.4.2", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw20 1.1.2", - "dao-dao-macros 2.4.2 (git+https://github.com/Kayanski/dao-contracts?branch=development)", - "dao-interface 2.4.2", - "thiserror", -] - [[package]] name = "dao-voting" version = "2.5.0" @@ -3933,22 +3141,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-denom 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw20 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-cw20-balance" version = "2.5.0" @@ -3967,24 +3159,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting-cw20-balance" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-base 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-cw20-staked" version = "2.5.0" @@ -4005,26 +3179,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting-cw20-staked" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw20 1.1.2", - "cw20-base 1.1.2", - "cw20-stake 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-cw4" version = "2.4.1" @@ -4038,7 +3192,7 @@ dependencies = [ "cw2 1.1.2", "cw4 1.1.2", "cw4-group 1.1.2", - "dao-dao-macros 2.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dao-dao-macros 2.4.2", "dao-interface 2.4.1", "thiserror", ] @@ -4061,24 +3215,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting-cw4" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw4 1.1.2", - "cw4-group 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-cw721-roles" version = "2.5.0" @@ -4095,37 +3231,15 @@ dependencies = [ "cw4 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-controllers 2.5.0", - "cw721-roles 2.5.0", - "dao-cw721-extensions 2.5.0", + "cw721-controllers", + "cw721-roles", + "dao-cw721-extensions", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", "dao-testing", "thiserror", ] -[[package]] -name = "dao-voting-cw721-roles" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw4 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", - "cw721-controllers 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-cw721-extensions 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-cw721-staked" version = "2.5.0" @@ -4142,13 +3256,13 @@ dependencies = [ "cw2 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-controllers 2.5.0", + "cw721-controllers", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter 2.5.0", + "dao-proposal-hook-counter", "dao-proposal-single 2.5.0", - "dao-test-custom-factory 2.5.0", + "dao-test-custom-factory", "dao-testing", "dao-voting 2.5.0", "osmosis-std", @@ -4157,29 +3271,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting-cw721-staked" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-storage-plus 1.2.0", - "cw-utils 1.0.3", - "cw2 1.1.2", - "cw721 0.18.0", - "cw721-base 0.18.0", - "cw721-controllers 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "dao-voting-onft-staked" version = "2.5.0" @@ -4193,13 +3284,13 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "cw721-controllers 2.5.0", + "cw721-controllers", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter 2.5.0", + "dao-proposal-hook-counter", "dao-proposal-single 2.5.0", - "dao-test-custom-factory 2.5.0", + "dao-test-custom-factory", "dao-testing", "dao-voting 2.5.0", "omniflix-std", @@ -4223,15 +3314,15 @@ dependencies = [ "cw-orch 0.24.1", "cw-ownable", "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer 2.5.0", + "cw-tokenfactory-issuer", "cw-utils 1.0.3", "cw2 1.1.2", "dao-dao-macros 2.5.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", - "dao-proposal-hook-counter 2.5.0", + "dao-proposal-hook-counter", "dao-proposal-single 2.5.0", - "dao-test-custom-factory 2.5.0", + "dao-test-custom-factory", "dao-testing", "dao-voting 2.5.0", "osmosis-std", @@ -4240,28 +3331,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "dao-voting-token-staked" -version = "2.5.0" -source = "git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch#a43d59936f4e7d548b889de9ba2ab093d2743bac" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers 1.1.2", - "cw-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-orch 0.24.1", - "cw-ownable", - "cw-storage-plus 1.2.0", - "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-utils 1.0.3", - "cw2 1.1.2", - "dao-dao-macros 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-hooks 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "thiserror", -] - [[package]] name = "der" version = "0.6.1" @@ -5138,21 +4207,21 @@ dependencies = [ "cosmos-sdk-proto 0.19.0", "cosmwasm-std", "cw-utils 1.0.3", - "cw-vesting 2.5.0", + "cw-vesting", "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 2.5.0", "cw721 0.18.0", "cw721-base 0.18.0", - "cw721-roles 2.5.0", + "cw721-roles", "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-pre-propose-single 2.5.0", "dao-proposal-single 2.5.0", - "dao-test-custom-factory 2.5.0", + "dao-test-custom-factory", "dao-voting 2.5.0", - "dao-voting-cw20-staked 2.5.0", - "dao-voting-cw721-staked 2.5.0", + "dao-voting-cw20-staked", + "dao-voting-cw721-staked", "env_logger", "once_cell", "rand", @@ -6325,21 +5394,21 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" name = "scripts" version = "2.5.0" dependencies = [ - "btsg-ft-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-admin-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "btsg-ft-factory", + "cw-admin-factory", "cw-orch 0.24.1", - "cw-payroll-factory 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-token-swap 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-tokenfactory-issuer 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw-vesting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "cw721-roles 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-cw-orch 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", + "cw721-roles", + "dao-cw-orch", "dao-interface 2.2.0", - "dao-interface 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-migrator 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", - "dao-proposal-single 2.4.2", - "dao-proposal-sudo 2.4.2", - "dao-voting 2.5.0 (git+https://github.com/hard-nett/dao-contracts?branch=feat/external-cw-orch)", + "dao-interface 2.5.0", + "dao-migrator", + "dao-proposal-single 2.5.0", + "dao-proposal-sudo", + "dao-voting 2.5.0", "dotenv", "pretty_env_logger", ] diff --git a/Cargo.toml b/Cargo.toml index ecd9b0da9..de54bfda4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,6 +87,7 @@ cw-orch = "0.24.1" # optional owner. cw-ownable = "0.5" +btsg-ft-factory = { path = "./contracts/external/btsg-ft-factory", version = "2.5.0" } cw-admin-factory = { path = "./contracts/external/cw-admin-factory", version = "2.5.0" } cw-denom = { path = "./packages/cw-denom", version = "2.5.0" } cw-fund-distributor = { path = "./contracts/distribution/cw-fund-distributor", version = "2.5.0" } @@ -94,6 +95,7 @@ cw-hooks = { path = "./packages/cw-hooks", version = "2.5.0" } cw-paginate-storage = { path = "./packages/cw-paginate-storage", version = "2.5.0" } cw-payroll-factory = { path = "./contracts/external/cw-payroll-factory", version = "2.5.0" } cw-stake-tracker = { path = "./packages/cw-stake-tracker", version = "2.5.0" } +cw-token-swap = { path = "./contracts/external/cw-token-swap", version = "2.5.0" } cw-tokenfactory-issuer = { path = "./contracts/external/cw-tokenfactory-issuer", version = "2.5.0", default-features = false } cw-tokenfactory-types = { path = "./packages/cw-tokenfactory-types", version = "2.5.0", default-features = false } cw-vesting = { path = "./contracts/external/cw-vesting", version = "2.5.0" } @@ -106,6 +108,7 @@ dao-dao-core = { path = "./contracts/dao-dao-core", version = "2.5.0" } dao-dao-macros = { path = "./packages/dao-dao-macros", version = "2.5.0" } dao-hooks = { path = "./packages/dao-hooks", version = "2.5.0" } dao-interface = { path = "./packages/dao-interface", version = "2.5.0" } +dao-migrator = { path = "./contracts/external/dao-migrator", version = "2.5.0" } dao-pre-propose-approval-single = { path = "./contracts/pre-propose/dao-pre-propose-approval-single", version = "2.5.0" } dao-pre-propose-approver = { path = "./contracts/pre-propose/dao-pre-propose-approver", version = "2.5.0" } dao-pre-propose-base = { path = "./packages/dao-pre-propose-base", version = "2.5.0" } diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 5266c6025..4ae7ec307 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -6,30 +6,24 @@ repository.workspace = true version.workspace = true [dependencies] -cw-orch = { workspace = true, features = ["daemon"] } -dao-cw-orch = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } - +cw-orch = { workspace = true, features = ["daemon"] } +dao-cw-orch = { path = "../packages/cw-orch", version = "2.5.0" } # scripts specific dotenv = { version = "0.15.0" } pretty_env_logger = { version = "0.5.0" } # cw-orch enabled DAO DAO deps [dev-dependencies] -dao-interface-master = { package = "dao-interface", git = "https://github.com/DA0-DA0/dao-contracts", branch = "main" } -dao-proposal-sudo = { git = "https://github.com/Kayanski/dao-contracts", branch = "development", features = [ - "library", -] } -dao-proposal-single = { git = "https://github.com/Kayanski/dao-contracts", branch = "development", features = [ - "library", -] } - -dao-interface = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -dao-voting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw-payroll-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw-token-swap = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw-admin-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw-tokenfactory-issuer = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw-vesting = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -cw721-roles = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -dao-migrator = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } -btsg-ft-factory = { git = "https://github.com/hard-nett/dao-contracts", branch = "feat/external-cw-orch" } \ No newline at end of file +dao-interface-master = { package = "dao-interface", git = "https://github.com/DA0-DA0/dao-contracts", branch = "main" } +dao-proposal-sudo = { workspace = true, features = ["library"] } +dao-proposal-single = { workspace = true, features = ["library"] } +dao-interface = { workspace = true } +dao-voting = { workspace = true } +cw-payroll-factory = { workspace = true } +cw-token-swap = { workspace = true } +cw-admin-factory = { workspace = true } +cw-tokenfactory-issuer = { workspace = true } +cw-vesting = { workspace = true } +cw721-roles = { workspace = true } +dao-migrator = { workspace = true } +btsg-ft-factory = { workspace = true } \ No newline at end of file diff --git a/scripts/src/dao.rs b/scripts/src/dao.rs index ba1c68268..144f03e57 100644 --- a/scripts/src/dao.rs +++ b/scripts/src/dao.rs @@ -1,9 +1,5 @@ use cw_orch::prelude::*; -use dao_cw_orch::{ - DaoDaoCore, DaoExternalAdminFactory, DaoExternalCw721Roles, DaoExternalCwVesting, - DaoExternalMigrator, DaoExternalPayrollFactory, DaoExternalTokenSwap, - DaoExternalTokenfactoryIssuer, DaoProposalSingle, DaoProposalSudo, -}; +use dao_cw_orch::{DaoDaoCore, DaoProposalSingle, DaoProposalSudo}; // minimal dao pub struct DaoDao { From 9e36aede2770fc5ba5204e062ad23e6ce75703b8 Mon Sep 17 00:00:00 2001 From: Gabe Date: Tue, 23 Jul 2024 16:00:04 -0500 Subject: [PATCH 31/50] Fix tokio dependency --- Cargo.lock | 30 +++++++++++++++++++++--------- Cargo.toml | 1 + ci/bootstrap-env/Cargo.toml | 1 + ci/integration-tests/Cargo.toml | 1 + 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ecaed6ba6..a2092db42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -637,6 +637,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", + "tokio", ] [[package]] @@ -4228,6 +4229,7 @@ dependencies = [ "serde", "serde_json", "test-context", + "tokio", ] [[package]] @@ -4437,14 +4439,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -4505,6 +4506,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -6324,20 +6335,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", "libc", "mio", + "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -6352,9 +6364,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index de54bfda4..e90b9865c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,6 +82,7 @@ test-context = "0.1" thiserror = { version = "1.0" } wynd-utils = "0.4" cw-orch = "0.24.1" +tokio = "=1.38.1" # One commit ahead of version 0.3.0. Allows initialization with an # optional owner. diff --git a/ci/bootstrap-env/Cargo.toml b/ci/bootstrap-env/Cargo.toml index 5ea498f2b..1f20b472a 100644 --- a/ci/bootstrap-env/Cargo.toml +++ b/ci/bootstrap-env/Cargo.toml @@ -6,6 +6,7 @@ repository = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosm-orc = { workspace = true } +tokio.workspace = true cw20 = { workspace = true } cw-utils = { workspace = true } cosmwasm-std = { workspace = true, features = ["ibc3"] } diff --git a/ci/integration-tests/Cargo.toml b/ci/integration-tests/Cargo.toml index 6291ec502..0c268f1ba 100644 --- a/ci/integration-tests/Cargo.toml +++ b/ci/integration-tests/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } # targeting wasm. [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosm-orc = { workspace = true } +tokio.workspace = true cw20 = { workspace = true } cw20-base = { workspace = true } cw721-base = { workspace = true } From dc43643bd75b7f27740624af59547c37673adc5f Mon Sep 17 00:00:00 2001 From: Gabe Date: Tue, 23 Jul 2024 17:12:34 -0500 Subject: [PATCH 32/50] Update integration_tests.yml --- .github/workflows/integration_tests.yml | 2 +- contracts/proposal/dao-proposal-single/Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 42af0ab81..66119a9f8 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -21,7 +21,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly-2023-02-02 + toolchain: nightly target: wasm32-unknown-unknown override: true diff --git a/contracts/proposal/dao-proposal-single/Cargo.toml b/contracts/proposal/dao-proposal-single/Cargo.toml index 6f694fe09..b93c69a44 100644 --- a/contracts/proposal/dao-proposal-single/Cargo.toml +++ b/contracts/proposal/dao-proposal-single/Cargo.toml @@ -31,10 +31,10 @@ dao-pre-propose-base = { workspace = true } dao-voting = { workspace = true } thiserror = { workspace = true } -cw-utils-v1 = { workspace = true} +cw-utils-v1 = { workspace = true } voting-v1 = { workspace = true } cw-proposal-single-v1 = { workspace = true, features = ["library"] } -cw-orch = {workspace = true} +cw-orch = { workspace = true } [dev-dependencies] anyhow = { workspace = true } From 73fe8c88baed586653b803c9d1d7e77b14a342ff Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 24 Jul 2024 01:22:53 -0500 Subject: [PATCH 33/50] Clippy fixes --- packages/cw-orch/src/external/mod.rs | 4 ++-- scripts/src/lib.rs | 4 ++-- scripts/src/tests/external/admin_factory.rs | 2 +- scripts/src/tests/external/btsg_ft_factory.rs | 2 +- scripts/src/tests/external/cw721_roles.rs | 2 +- scripts/src/tests/external/dao_migration.rs | 2 +- scripts/src/tests/external/mod.rs | 4 ++-- scripts/src/tests/external/payroll.rs | 2 +- scripts/src/tests/external/tokenfactory_issuer.rs | 2 +- scripts/src/tests/external/vesting.rs | 3 +-- scripts/src/tests/mod.rs | 2 +- 11 files changed, 14 insertions(+), 15 deletions(-) diff --git a/packages/cw-orch/src/external/mod.rs b/packages/cw-orch/src/external/mod.rs index c5c5ad30f..ee24e4bfd 100644 --- a/packages/cw-orch/src/external/mod.rs +++ b/packages/cw-orch/src/external/mod.rs @@ -1,17 +1,17 @@ mod admin_factory; +mod btsg_ft_factory; mod cw721_roles; mod cw_vesting; mod migrator; mod payroll_factory; mod token_swap; mod tokenfactory_issuer; -mod btsg_ft_factory; pub use admin_factory::DaoExternalAdminFactory; +pub use btsg_ft_factory::DaoExternalFantokenFactory; pub use cw721_roles::DaoExternalCw721Roles; pub use cw_vesting::DaoExternalCwVesting; pub use migrator::DaoExternalMigrator; pub use payroll_factory::DaoExternalPayrollFactory; pub use token_swap::DaoExternalTokenSwap; pub use tokenfactory_issuer::DaoExternalTokenfactoryIssuer; -pub use btsg_ft_factory::DaoExternalFantokenFactory; diff --git a/scripts/src/lib.rs b/scripts/src/lib.rs index ecbdd8053..99f646ded 100644 --- a/scripts/src/lib.rs +++ b/scripts/src/lib.rs @@ -1,4 +1,4 @@ -#[allow(clippy::collapsible_if)] +#[allow(dead_code)] fn main() {} mod dao; @@ -7,4 +7,4 @@ pub use dao::*; pub use external::*; #[cfg(test)] -mod tests; \ No newline at end of file +mod tests; diff --git a/scripts/src/tests/external/admin_factory.rs b/scripts/src/tests/external/admin_factory.rs index b75750ed6..beeb4a668 100644 --- a/scripts/src/tests/external/admin_factory.rs +++ b/scripts/src/tests/external/admin_factory.rs @@ -9,7 +9,7 @@ use crate::{ fn test_admin() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; + let _app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/external/btsg_ft_factory.rs b/scripts/src/tests/external/btsg_ft_factory.rs index b75750ed6..beeb4a668 100644 --- a/scripts/src/tests/external/btsg_ft_factory.rs +++ b/scripts/src/tests/external/btsg_ft_factory.rs @@ -9,7 +9,7 @@ use crate::{ fn test_admin() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; + let _app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/external/cw721_roles.rs b/scripts/src/tests/external/cw721_roles.rs index 202778114..c38a32aa6 100644 --- a/scripts/src/tests/external/cw721_roles.rs +++ b/scripts/src/tests/external/cw721_roles.rs @@ -9,7 +9,7 @@ use crate::{ fn test_cw721_roles() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = Cw721RolesSuite::deploy_on(mock.clone(), admin.clone())?; + let _app = Cw721RolesSuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/external/dao_migration.rs b/scripts/src/tests/external/dao_migration.rs index 0f80a6948..ed333c6a0 100644 --- a/scripts/src/tests/external/dao_migration.rs +++ b/scripts/src/tests/external/dao_migration.rs @@ -9,7 +9,7 @@ use crate::{ fn test_dao_migration() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = DaoMigrationSuite::deploy_on(mock.clone(), admin.clone())?; + let _app = DaoMigrationSuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/external/mod.rs b/scripts/src/tests/external/mod.rs index 0cd1957fa..0a7c11872 100644 --- a/scripts/src/tests/external/mod.rs +++ b/scripts/src/tests/external/mod.rs @@ -1,8 +1,8 @@ pub mod admin_factory; +pub mod btsg_ft_factory; pub mod cw721_roles; +pub mod dao_migration; pub mod payroll; pub mod token_swap; pub mod tokenfactory_issuer; pub mod vesting; -pub mod dao_migration; -pub mod btsg_ft_factory; diff --git a/scripts/src/tests/external/payroll.rs b/scripts/src/tests/external/payroll.rs index eea003b1a..6fb284970 100644 --- a/scripts/src/tests/external/payroll.rs +++ b/scripts/src/tests/external/payroll.rs @@ -9,7 +9,7 @@ use crate::{ fn test_payroll() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = PayrollSuite::deploy_on(mock.clone(), admin.clone())?; + let _app = PayrollSuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/external/tokenfactory_issuer.rs b/scripts/src/tests/external/tokenfactory_issuer.rs index 30c518986..46a3b9fd6 100644 --- a/scripts/src/tests/external/tokenfactory_issuer.rs +++ b/scripts/src/tests/external/tokenfactory_issuer.rs @@ -9,7 +9,7 @@ use crate::{ fn test_tokenfactory() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = TokenFactorySuite::deploy_on(mock.clone(), admin.clone())?; + let _app = TokenFactorySuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) diff --git a/scripts/src/tests/external/vesting.rs b/scripts/src/tests/external/vesting.rs index 2ef501b47..0bebbfaf7 100644 --- a/scripts/src/tests/external/vesting.rs +++ b/scripts/src/tests/external/vesting.rs @@ -1,7 +1,6 @@ use cw_orch::{anyhow, prelude::*}; use crate::{ - external::TokenFactorySuite, tests::{ADMIN, PREFIX}, VestingSuite, }; @@ -10,7 +9,7 @@ use crate::{ fn test_vesting() -> anyhow::Result<()> { let mock = MockBech32::new(PREFIX); let admin = mock.addr_make(ADMIN); - let app = VestingSuite::deploy_on(mock.clone(), admin.clone())?; + let _app = VestingSuite::deploy_on(mock.clone(), admin.clone())?; mock.next_block().unwrap(); Ok(()) } diff --git a/scripts/src/tests/mod.rs b/scripts/src/tests/mod.rs index bb2375cef..29d6e7e54 100644 --- a/scripts/src/tests/mod.rs +++ b/scripts/src/tests/mod.rs @@ -1,5 +1,5 @@ -mod external; mod deploy; +mod external; pub(crate) const PREFIX: &str = "mock"; pub(crate) const ADMIN: &str = "admin"; From cad98379970fe9ef5c0947e00386b2e3a03254be Mon Sep 17 00:00:00 2001 From: hard-nett Date: Wed, 24 Jul 2024 15:27:45 +0000 Subject: [PATCH 34/50] remove tf issuer init for now --- scripts/src/tests/deploy/external.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 8e77267fe..c19034170 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -144,11 +144,6 @@ impl cw_orch::contract::Deploy for TokenFactorySuite fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone()).unwrap(); - // ########### Instantiate ############## - let init = TokenfactoryIssuerInit::NewToken { - subdenom: "DAOTOKEN".into(), - }; - suite.tokenfactory.instantiate(&init, None, None)?; Ok(suite) } } From 3bdf843a8a08d2e4f71a2a48517802e520e4ab97 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Wed, 24 Jul 2024 15:42:12 +0000 Subject: [PATCH 35/50] lint --- scripts/src/tests/deploy/external.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index c19034170..b17475577 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -1,7 +1,6 @@ use crate::external::*; use btsg_ft_factory::msg::InstantiateMsg; use cw_orch::prelude::*; -use cw_tokenfactory_issuer::msg::InstantiateMsg as TokenfactoryIssuerInit; // admin factory impl cw_orch::contract::Deploy for AdminFactorySuite { From ed3020df2c3195c585cb8db5bdc1312d4e97364b Mon Sep 17 00:00:00 2001 From: hard-nett Date: Wed, 24 Jul 2024 20:20:20 +0000 Subject: [PATCH 36/50] bump ismellike cleanups --- Cargo.lock | 1109 +----- Cargo.toml | 5 +- packages/cw-orch/Cargo.toml | 4 +- scripts/Cargo.toml | 41 +- scripts/src/Cargo.lock | 4850 ++++++++++++++++++++++++++ scripts/src/tests/deploy/external.rs | 18 +- 6 files changed, 4921 insertions(+), 1106 deletions(-) create mode 100644 scripts/src/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock index a2092db42..f26313460 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,21 +304,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.86" @@ -331,17 +316,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] - [[package]] name = "async-stream" version = "0.3.5" @@ -441,12 +415,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base16" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" - [[package]] name = "base16ct" version = "0.1.1" @@ -471,12 +439,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64ct" version = "1.6.0" @@ -524,7 +486,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" dependencies = [ - "bs58 0.4.0", + "bs58", "hmac", "k256 0.11.6", "once_cell", @@ -536,50 +498,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "bip32" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" -dependencies = [ - "bs58 0.5.1", - "hmac", - "k256 0.13.3", - "rand_core 0.6.4", - "ripemd", - "sha2 0.10.8", - "subtle", - "zeroize", -] - -[[package]] -name = "bitcoin" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" -dependencies = [ - "bech32 0.9.1", - "bitcoin-private", - "bitcoin_hashes", - "hex_lit", - "secp256k1", -] - -[[package]] -name = "bitcoin-private" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" - -[[package]] -name = "bitcoin_hashes" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" -dependencies = [ - "bitcoin-private", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -649,15 +567,6 @@ dependencies = [ "sha2 0.9.9", ] -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2 0.10.8", -] - [[package]] name = "btsg-ft-factory" version = "2.5.0" @@ -736,12 +645,7 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets 0.52.6", ] [[package]] @@ -872,18 +776,6 @@ dependencies = [ "tonic 0.9.2", ] -[[package]] -name = "cosmos-sdk-proto" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" -dependencies = [ - "prost 0.12.3", - "prost-types 0.12.3", - "tendermint-proto 0.34.1", - "tonic 0.10.2", -] - [[package]] name = "cosmos-sdk-proto" version = "0.21.1" @@ -901,7 +793,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" dependencies = [ - "bip32 0.4.0", + "bip32", "cosmos-sdk-proto 0.14.0", "ecdsa 0.14.8", "eyre", @@ -922,7 +814,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa07096219b1817432b8f1e47c22e928c64bbfd231fc08f0a98f0e7ddd602b7" dependencies = [ - "bip32 0.4.0", + "bip32", "cosmos-sdk-proto 0.15.0", "ecdsa 0.14.8", "eyre", @@ -937,28 +829,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cosmrs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" -dependencies = [ - "bip32 0.5.2", - "cosmos-sdk-proto 0.20.0", - "ecdsa 0.16.9", - "eyre", - "k256 0.13.3", - "rand_core 0.6.4", - "serde", - "serde_json", - "signature 2.2.0", - "subtle-encoding", - "tendermint 0.34.1", - "tendermint-rpc 0.34.1", - "thiserror", - "tokio", -] - [[package]] name = "cosmwasm-crypto" version = "1.5.7" @@ -1046,15 +916,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "crypto-bigint" version = "0.4.9" @@ -1095,7 +956,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" dependencies = [ - "sct 0.6.1", + "sct", ] [[package]] @@ -1111,46 +972,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", - "subtle-ng", - "zeroize", -] - [[package]] name = "cw-address-like" version = "1.0.4" @@ -1340,17 +1161,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-hooks" -version = "2.2.0" -source = "git+https://github.com/DA0-DA0/dao-contracts?branch=main#7f89ad1604e8022f202aef729853b0c8c7196988" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus 1.2.0", - "thiserror", -] - [[package]] name = "cw-hooks" version = "2.4.2" @@ -1421,14 +1231,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" dependencies = [ "anyhow", - "cosmrs 0.15.0", "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", - "cw-orch-daemon", "cw-orch-fns-derive 0.22.0", "cw-orch-mock 0.23.2", - "cw-orch-networks", "cw-orch-traits 0.23.3", "cw-utils 1.0.3", "hex", @@ -1436,7 +1243,6 @@ dependencies = [ "schemars", "serde", "thiserror", - "tokio", ] [[package]] @@ -1470,49 +1276,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-orch-daemon" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" -dependencies = [ - "anyhow", - "async-recursion", - "base16", - "base64 0.22.1", - "bitcoin", - "chrono", - "cosmrs 0.15.0", - "cosmwasm-std", - "cw-orch-core", - "cw-orch-networks", - "cw-orch-traits 0.23.3", - "dirs", - "ed25519-dalek 2.1.1", - "eyre", - "file-lock", - "flate2", - "hex", - "hkd32", - "lazy_static", - "log", - "once_cell", - "prost 0.12.3", - "prost-types 0.12.3", - "rand_core 0.6.4", - "reqwest", - "ring 0.17.8", - "ripemd", - "schemars", - "serde", - "serde_json", - "sha2 0.10.8", - "thiserror", - "tokio", - "tonic 0.10.2", - "uid", -] - [[package]] name = "cw-orch-fns-derive" version = "0.19.1" @@ -1567,16 +1330,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "cw-orch-networks" -version = "0.23.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" -dependencies = [ - "cw-orch-core", - "serde", -] - [[package]] name = "cw-orch-traits" version = "0.22.0" @@ -1976,19 +1729,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cw20" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45a8794a5dd33b66af34caee52a7beceb690856adcc1682b6e3db88b2cdee62" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils 0.16.0", - "schemars", - "serde", -] - [[package]] name = "cw20" version = "1.1.2" @@ -2528,20 +2268,6 @@ dependencies = [ "dao-voting 2.5.0", ] -[[package]] -name = "dao-interface" -version = "2.2.0" -source = "git+https://github.com/DA0-DA0/dao-contracts?branch=main#7f89ad1604e8022f202aef729853b0c8c7196988" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-hooks 2.2.0", - "cw-utils 0.16.0", - "cw2 0.16.0", - "cw20 0.16.0", - "cw721 0.16.0", -] - [[package]] name = "dao-interface" version = "2.4.1" @@ -3411,12 +3137,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dyn-clone" version = "1.0.17" @@ -3458,63 +3178,25 @@ dependencies = [ "signature 1.6.4", ] -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8 0.10.2", - "serde", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - [[package]] name = "ed25519-dalek" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", + "curve25519-dalek", + "ed25519", "sha2 0.9.9", "zeroize", ] -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", -] - [[package]] name = "ed25519-zebra" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ - "curve25519-dalek 3.2.0", + "curve25519-dalek", "hashbrown 0.12.3", "hex", "rand_core 0.6.4", @@ -3568,15 +3250,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_logger" version = "0.10.2" @@ -3625,12 +3298,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - [[package]] name = "ff" version = "0.12.1" @@ -3651,32 +3318,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "file-lock" -version = "2.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "flate2" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "flex-error" version = "0.4.4" @@ -3693,21 +3334,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -3946,27 +3572,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hex_lit" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" - -[[package]] -name = "hkd32" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" -dependencies = [ - "hmac", - "once_cell", - "pbkdf2", - "rand_core 0.6.4", - "sha2 0.10.8", - "subtle-encoding", - "zeroize", -] - [[package]] name = "hmac" version = "0.12.1" @@ -4060,10 +3665,10 @@ dependencies = [ "headers", "http", "hyper", - "hyper-rustls 0.22.1", - "rustls-native-certs 0.5.0", + "hyper-rustls", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "tower-service", "webpki", ] @@ -4078,28 +3683,14 @@ dependencies = [ "futures-util", "hyper", "log", - "rustls 0.19.1", - "rustls-native-certs 0.5.0", + "rustls", + "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", "webpki", "webpki-roots", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-timeout" version = "0.4.1" @@ -4112,42 +3703,6 @@ dependencies = [ "tokio-io-timeout", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "idna" version = "0.5.0" @@ -4232,12 +3787,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - [[package]] name = "is-terminal" version = "0.4.13" @@ -4388,16 +3937,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.22" @@ -4448,23 +3987,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nom" version = "7.1.3" @@ -4575,50 +4097,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] - [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -4682,29 +4166,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "paste" version = "1.0.15" @@ -4738,18 +4199,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" dependencies = [ - "peg-macros 0.7.0", - "peg-runtime 0.7.0", -] - -[[package]] -name = "peg" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" -dependencies = [ - "peg-macros 0.8.4", - "peg-runtime 0.8.3", + "peg-macros", + "peg-runtime", ] [[package]] @@ -4758,18 +4209,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" dependencies = [ - "peg-runtime 0.7.0", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" -dependencies = [ - "peg-runtime 0.8.3", + "peg-runtime", "proc-macro2", "quote", ] @@ -4780,12 +4220,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" -[[package]] -name = "peg-runtime" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -4889,12 +4323,6 @@ dependencies = [ "spki 0.7.3", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -4904,16 +4332,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "pretty_env_logger" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" -dependencies = [ - "env_logger", - "log", -] - [[package]] name = "prettyplease" version = "0.2.20" @@ -5054,15 +4472,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - [[package]] name = "redox_users" version = "0.4.5" @@ -5103,50 +4512,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls 0.24.2", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - [[package]] name = "rfc6979" version = "0.3.1" @@ -5177,27 +4542,12 @@ dependencies = [ "cc", "libc", "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", + "spin", + "untrusted", "web-sys", "winapi", ] -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - [[package]] name = "ripemd" version = "0.1.3" @@ -5251,15 +4601,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - [[package]] name = "rustix" version = "0.38.34" @@ -5281,23 +4622,11 @@ checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ "base64 0.13.1", "log", - "ring 0.16.20", - "sct 0.6.1", + "ring", + "sct", "webpki", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.8", - "rustls-webpki", - "sct 0.7.1", -] - [[package]] name = "rustls-native-certs" version = "0.5.0" @@ -5305,42 +4634,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" dependencies = [ "openssl-probe", - "rustls 0.19.1", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", + "rustls", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", -] - [[package]] name = "rustversion" version = "1.0.17" @@ -5395,53 +4693,14 @@ dependencies = [ "syn 2.0.74", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scripts" -version = "2.5.0" -dependencies = [ - "btsg-ft-factory", - "cw-admin-factory", - "cw-orch 0.24.1", - "cw-payroll-factory", - "cw-token-swap", - "cw-tokenfactory-issuer", - "cw-vesting", - "cw721-roles", - "dao-cw-orch", - "dao-interface 2.2.0", - "dao-interface 2.5.0", - "dao-migrator", - "dao-proposal-single 2.5.0", - "dao-proposal-sudo", - "dao-voting 2.5.0", - "dotenv", - "pretty_env_logger", -] - [[package]] name = "sct" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -5472,25 +4731,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "bitcoin_hashes", - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.11.1" @@ -5601,18 +4841,6 @@ dependencies = [ "syn 2.0.74", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -5677,15 +4905,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "signature" version = "1.6.4" @@ -5715,12 +4934,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - [[package]] name = "socket2" version = "0.5.7" @@ -5737,12 +4950,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.6.0" @@ -5842,12 +5049,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - [[package]] name = "syn" version = "1.0.109" @@ -5876,40 +5077,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "tendermint" version = "0.23.9" @@ -5918,8 +5085,8 @@ checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" dependencies = [ "async-trait", "bytes", - "ed25519 1.5.3", - "ed25519-dalek 1.0.1", + "ed25519", + "ed25519-dalek", "flex-error", "futures", "k256 0.11.6", @@ -5949,8 +5116,8 @@ checksum = "baa1d2d0ec1b531ba7d196f0dbee5e78ed2a82bfba928e88dff64aeec0b26073" dependencies = [ "async-trait", "bytes", - "ed25519 1.5.3", - "ed25519-dalek 1.0.1", + "ed25519", + "ed25519-dalek", "flex-error", "futures", "k256 0.11.6", @@ -5972,37 +5139,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "tendermint" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" -dependencies = [ - "bytes", - "digest 0.10.7", - "ed25519 2.2.3", - "ed25519-consensus", - "flex-error", - "futures", - "k256 0.13.3", - "num-traits", - "once_cell", - "prost 0.12.3", - "prost-types 0.12.3", - "ripemd", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.10.8", - "signature 2.2.0", - "subtle", - "subtle-encoding", - "tendermint-proto 0.34.1", - "time", - "zeroize", -] - [[package]] name = "tendermint-config" version = "0.23.9" @@ -6031,20 +5167,6 @@ dependencies = [ "url", ] -[[package]] -name = "tendermint-config" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" -dependencies = [ - "flex-error", - "serde", - "serde_json", - "tendermint 0.34.1", - "toml", - "url", -] - [[package]] name = "tendermint-proto" version = "0.23.9" @@ -6099,24 +5221,6 @@ dependencies = [ "time", ] -[[package]] -name = "tendermint-proto" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" -dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.12.3", - "prost-types 0.12.3", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - [[package]] name = "tendermint-proto" version = "0.35.0" @@ -6149,8 +5253,8 @@ dependencies = [ "http", "hyper", "hyper-proxy", - "hyper-rustls 0.22.1", - "peg 0.7.0", + "hyper-rustls", + "peg", "pin-project", "serde", "serde_bytes", @@ -6164,7 +5268,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid 0.8.2", + "uuid", "walkdir", ] @@ -6182,8 +5286,8 @@ dependencies = [ "http", "hyper", "hyper-proxy", - "hyper-rustls 0.22.1", - "peg 0.7.0", + "hyper-rustls", + "peg", "pin-project", "serde", "serde_bytes", @@ -6198,40 +5302,7 @@ dependencies = [ "tokio", "tracing", "url", - "uuid 0.8.2", - "walkdir", -] - -[[package]] -name = "tendermint-rpc" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" -dependencies = [ - "async-trait", - "bytes", - "flex-error", - "futures", - "getrandom", - "peg 0.8.4", - "pin-project", - "rand", - "reqwest", - "semver", - "serde", - "serde_bytes", - "serde_json", - "subtle", - "subtle-encoding", - "tendermint 0.34.1", - "tendermint-config 0.34.1", - "tendermint-proto 0.34.1", - "thiserror", - "time", - "tokio", - "tracing", - "url", - "uuid 1.10.0", + "uuid", "walkdir", ] @@ -6344,9 +5415,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", @@ -6373,37 +5442,17 @@ dependencies = [ "syn 2.0.74", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "rustls 0.19.1", + "rustls", "tokio", "webpki", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-stream" version = "0.1.15" @@ -6497,37 +5546,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tonic" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.21.7", - "bytes", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost 0.12.3", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile", - "tokio", - "tokio-rustls 0.24.1", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.4.13" @@ -6619,12 +5637,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" -[[package]] -name = "uid" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -6664,12 +5676,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "url" version = "2.5.2" @@ -6687,18 +5693,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -[[package]] -name = "uuid" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -6768,18 +5762,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -6825,8 +5807,8 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "ring", + "untrusted", ] [[package]] @@ -6881,15 +5863,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -7038,16 +6011,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wynd-utils" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index e90b9865c..7f629b199 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -exclude = ["ci/configs/", "wasmvm/libwasmvm"] +exclude = ["ci/configs/", "wasmvm/libwasmvm", "scripts"] members = [ "contracts/dao-dao-core", "contracts/distribution/*", @@ -11,7 +11,6 @@ members = [ "contracts/voting/*", "packages/*", "ci/*", - "scripts" ] resolver = "2" @@ -155,4 +154,4 @@ dao-pre-propose-single-v241 = { package = "dao-pre-propose-single", version = "= dao-proposal-multiple-v241 = { package = "dao-proposal-multiple", version = "=2.4.1" } dao-proposal-single-v241 = { package = "dao-proposal-single", version = "=2.4.1" } dao-voting-cw4-v241 = { package = "dao-voting-cw4", version = "=2.4.1" } -dao-voting-v241 = { package = "dao-voting", version = "=2.4.1" } +dao-voting-v241 = { package = "dao-voting", version = "=2.4.1" } \ No newline at end of file diff --git a/packages/cw-orch/Cargo.toml b/packages/cw-orch/Cargo.toml index 2bc5a3112..f03ecd4e2 100644 --- a/packages/cw-orch/Cargo.toml +++ b/packages/cw-orch/Cargo.toml @@ -12,7 +12,7 @@ default = [] wasm_test = [] [dependencies] -btsg-ft-factory = { path = "../../contracts/external/btsg-ft-factory" } +btsg-ft-factory.workspace = true cosmwasm-std.workspace = true cw-orch.workspace = true cw20-stake.workspace = true @@ -46,4 +46,4 @@ dao-voting-cw721-staked.workspace = true dao-voting-token-staked.workspace = true dao-rewards-distributor.workspace = true cw-fund-distributor.workspace = true -serde.workspace = true +serde.workspace = true \ No newline at end of file diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 4ae7ec307..253537797 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -1,29 +1,32 @@ [package] name = "scripts" -edition.workspace = true -license.workspace = true -repository.workspace = true -version.workspace = true +edition = "2021" +license = "BSD-3-Clause" +repository = "https://github.com/DA0-DA0/dao-contracts" +version = "2.5.0" [dependencies] -cw-orch = { workspace = true, features = ["daemon"] } -dao-cw-orch = { path = "../packages/cw-orch", version = "2.5.0" } +cw-orch = { version = "0.24.1", features = ["daemon"] } +dao-cw-orch = { path = "../packages/cw-orch", version = "2.5.0" } # scripts specific dotenv = { version = "0.15.0" } pretty_env_logger = { version = "0.5.0" } # cw-orch enabled DAO DAO deps [dev-dependencies] -dao-interface-master = { package = "dao-interface", git = "https://github.com/DA0-DA0/dao-contracts", branch = "main" } -dao-proposal-sudo = { workspace = true, features = ["library"] } -dao-proposal-single = { workspace = true, features = ["library"] } -dao-interface = { workspace = true } -dao-voting = { workspace = true } -cw-payroll-factory = { workspace = true } -cw-token-swap = { workspace = true } -cw-admin-factory = { workspace = true } -cw-tokenfactory-issuer = { workspace = true } -cw-vesting = { workspace = true } -cw721-roles = { workspace = true } -dao-migrator = { workspace = true } -btsg-ft-factory = { workspace = true } \ No newline at end of file +dao-proposal-sudo = { path = "../contracts/test/dao-proposal-sudo", features = [ + "library", +] } +dao-proposal-single = { path = "../contracts/proposal/dao-proposal-single", features = [ + "library", +] } +dao-interface = { path = "../packages/dao-interface" } +dao-voting = { path = "../packages/dao-voting" } +cw-payroll-factory = { path = "../contracts/external/cw-payroll-factory" } +cw-token-swap = { path = "../contracts/external/cw-token-swap" } +cw-admin-factory = { path = "../contracts/external/cw-admin-factory" } +cw-tokenfactory-issuer = { path = "../contracts/external/cw-tokenfactory-issuer" } +cw-vesting = { path = "../contracts/external/cw-vesting" } +cw721-roles = { path = "../contracts/external/cw721-roles" } +dao-migrator = { path = "../contracts/external/dao-migrator" } +btsg-ft-factory = { path = "../contracts/external/btsg-ft-factory" } \ No newline at end of file diff --git a/scripts/src/Cargo.lock b/scripts/src/Cargo.lock new file mode 100644 index 000000000..bf097f6c2 --- /dev/null +++ b/scripts/src/Cargo.lock @@ -0,0 +1,4850 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "abstract-cw-multi-test" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c77f8d4bac08f74fbc4fce8943cb2d35e742682b6cae8cb65555d6cd3830feb" +dependencies = [ + "anyhow", + "bech32 0.11.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20-ics20", + "derivative", + "hex", + "itertools 0.12.1", + "log", + "prost 0.12.3", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58", + "hmac", + "k256", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "bitcoin" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" +dependencies = [ + "bech32 0.9.1", + "bitcoin-private", + "bitcoin_hashes", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", +] + +[[package]] +name = "btsg-ft-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +dependencies = [ + "serde", +] + +[[package]] +name = "cc" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", + "tonic", +] + +[[package]] +name = "cosmos-sdk-proto" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.35.0", +] + +[[package]] +name = "cosmrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" +dependencies = [ + "bip32", + "cosmos-sdk-proto 0.20.0", + "ecdsa", + "eyre", + "k256", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", + "tokio", +] + +[[package]] +name = "cosmwasm-crypto" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd50718a2b6830ce9eb5d465de5a018a12e71729d66b70807ce97e6dd14f931d" +dependencies = [ + "digest 0.10.7", + "ecdsa", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "242e98e7a231c122e08f300d9db3262d1007b51758a8732cd6210b3e9faa4f3a" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7879036156092ad1c22fe0d7316efc5a5eceec2bc3906462a2560215f2a2f929" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb57855fbfc83327f8445ae0d413b1a05ac0d68c396ab4d122b2abd7bb82cb6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c1556156fdf892a55cced6115968b961eaaadd6f724a2c2cb7d1e168e32dd3" +dependencies = [ + "base64 0.21.7", + "bech32 0.9.1", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + +[[package]] +name = "cw-admin-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-controllers" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f0bc6019b4d3d81e11f5c384bcce7173e2210bd654d75c6c9668e12cca05dfa" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-controllers" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57de8d3761e46be863e3ac1eba8c8a976362a48c6abf240df1e26c3e421ee9e8" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468b8f2696f625c8e15b5468f9420c8eabfaf23cb4fd7e6c660fc7e0cc8d77b8" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-paginate-storage 0.1.0", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw721 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-core-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c93e684945473777ebed2bcaf9f0af2291653f79d5c81774c6826350ba6d88de" +dependencies = [ + "cosmwasm-std", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw2 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw-core-interface" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "cosmwasm-std", + "cw-core-macros 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw2 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw-core-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f20a77489d2dc8a1c12cb0b9671b6cbdca88f12fe65e1a4ee9899490f7669dcc" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-core-macros" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-denom" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decaa8be7ffa8090dc62d8bb8ee97cd3f41f815a41ba08de1d40cacef6c3cb4b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-denom" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-fund-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-stake 2.5.0", + "dao-interface 2.5.0", + "dao-voting-cw20-staked", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "097ee97b99ecc90372eac3bcaf698d940a15f806f2ba1e1e901c729f6523e16e" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + +[[package]] +name = "cw-orch" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" +dependencies = [ + "anyhow", + "cosmrs", + "cosmwasm-std", + "cw-orch-contract-derive", + "cw-orch-core", + "cw-orch-daemon", + "cw-orch-fns-derive", + "cw-orch-mock", + "cw-orch-networks", + "cw-orch-traits", + "cw-utils 1.0.3", + "hex", + "log", + "schemars", + "serde", + "thiserror", + "tokio", +] + +[[package]] +name = "cw-orch-contract-derive" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc8ba75692fc7bd30e91c78fad2dc208a738e4e6ea26b232f9352c320e35543" +dependencies = [ + "convert_case", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "cw-orch-core" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abd640f67f655411542a3c148769270c7a9e63d4097c2dc4a1f6edf23b7a9b4" +dependencies = [ + "abstract-cw-multi-test", + "anyhow", + "cosmos-sdk-proto 0.21.1", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "dirs", + "log", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "cw-orch-daemon" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" +dependencies = [ + "anyhow", + "async-recursion", + "base16", + "base64 0.22.1", + "bitcoin", + "chrono", + "cosmrs", + "cosmwasm-std", + "cw-orch-core", + "cw-orch-networks", + "cw-orch-traits", + "dirs", + "ed25519-dalek", + "eyre", + "file-lock", + "flate2", + "hex", + "hkd32", + "lazy_static", + "log", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "rand_core 0.6.4", + "reqwest", + "ring", + "ripemd", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "tokio", + "tonic", + "uid", +] + +[[package]] +name = "cw-orch-fns-derive" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e21b23116a0702f540d7fa3f16e8276682d860b589fed56259220ad59d768e" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-orch-mock" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57beb30d841bde79df51c9402741ef926ca8ef7ecd3570aa180074f767ac04d3" +dependencies = [ + "abstract-cw-multi-test", + "cosmwasm-std", + "cw-orch-core", + "cw-utils 1.0.3", + "log", + "serde", + "sha2 0.10.8", +] + +[[package]] +name = "cw-orch-networks" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" +dependencies = [ + "cw-orch-core", + "serde", +] + +[[package]] +name = "cw-orch-traits" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e6b81dc282724c9c6334a499f4867e575458e69fe5b99034d4f962860f3357" +dependencies = [ + "cw-orch-core", + "prost 0.12.3", + "prost-types 0.12.3", +] + +[[package]] +name = "cw-ownable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093dfb4520c48b5848274dd88ea99e280a04bc08729603341c7fb0d758c74321" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like", + "cw-ownable-derive", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + +[[package]] +name = "cw-ownable-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d3bf2e0f341bb6cc100d7d441d31cf713fbd3ce0c511f91e79f14b40a889af" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-paginate-storage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b854833e07c557dee02d1b61a21bb0731743bb2e3bbdc3e446a0d8a38af40ec4" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 0.13.4", + "serde", +] + +[[package]] +name = "cw-paginate-storage" +version = "2.5.0" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + +[[package]] +name = "cw-payroll-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-vesting", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-proposal-single" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6408483e1ac17a7e2b98ef6fa1379776964353bcbf501942d22ee1c1323117" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw3", + "dao-voting 0.1.0", + "indexable-hooks", + "proposal-hooks", + "schemars", + "serde", + "thiserror", + "vote-hooks", +] + +[[package]] +name = "cw-stake-tracker" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-wormhole", +] + +[[package]] +name = "cw-storage-plus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648b1507290bbc03a8d88463d7cd9b04b1fa0155e5eef366c4fa052b9caaac7a" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b6f91c0b94481a3e9ef1ceb183c37d00764f8751e39b45fc09f4d9b970d469" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-token-swap" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-tokenfactory-issuer" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-types", + "cw2 1.1.2", + "dao-interface 2.5.0", + "osmosis-std", + "prost 0.12.3", + "prost-derive 0.12.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-tokenfactory-types" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "dao-interface 2.5.0", + "osmosis-std", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "cw-utils" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbaecb78c8e8abfd6b4258c7f4fbeb5c49a5e45ee4d910d3240ee8e1d714e1b" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 0.16.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-vesting" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-orch", + "cw-ownable", + "cw-stake-tracker", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-wormhole", + "cw2 1.1.2", + "cw20 1.1.2", + "serde", + "thiserror", + "wynd-utils", +] + +[[package]] +name = "cw-wormhole" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + +[[package]] +name = "cw2" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cf4639517490dd36b333bbd6c4fbd92e325fd0acf4683b41753bc5eb63bfc1" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cb782b8f110819a4eb5dbbcfed25ffba49ec16bbe32b4ad8da50a5ce68fec05" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", +] + +[[package]] +name = "cw20-base" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0306e606581f4fb45e82bcbb7f0333179ed53dd949c6523f01a99b4bfc1475a0" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-base" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ad79e86ea3707229bf78df94e08732e8f713207b4a77b2699755596725e7d9" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "cw20 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-ics20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76221201da08fed611c857ea3aa21c031a4a7dc771a8b1750559ca987335dc02" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-stake" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f0d51ce27a97b51f66d737183845bc6d82f46f4b246dc959d1265d86906ccc" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-stake" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-ownable", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "dao-hooks", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "cw20-stake-external-rewards" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "dao-hooks", + "stake-cw20-external-rewards", + "thiserror", +] + +[[package]] +name = "cw20-stake-reward-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "stake-cw20-reward-distributor", + "thiserror", +] + +[[package]] +name = "cw20-staked-balance-voting" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf8c2ee92372d35c3a48fd6ddd490a1a4426902748017dd0b7f551d06484e28" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw3" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe19462a7f644ba60c19d3443cb90d00c50d9b6b3b0a3a7fca93df8261af979b" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw4" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0acc3549d5ce11c6901b3a676f2e2628684722197054d97cd0101ea174ed5cbd" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw4" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24754ff6e45f2a1c60adc409d9b2eb87666012c44021329141ffaab3388fccd2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "serde", +] + +[[package]] +name = "cw4-group" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c95c89153e7831c8306c8eba40a3daa76f9c7b8f5179dd0b8628aca168ec7a" +dependencies = [ + "cosmwasm-std", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw4 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw4-group" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a22c3af54c52edf528673b420a67a1648be2c159b8ec778d2fbf543df24b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw4-voting" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-core-macros 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw4 0.13.4", + "cw4-group 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035818368a74c07dd9ed5c5a93340199ba251530162010b9f34c3809e3b97df1" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c4d286625ccadc957fe480dd3bdc54ada19e0e6b5b9325379db3130569e914" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", +] + +[[package]] +name = "cw721-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-base" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da518d9f68bfda7d972cbaca2e8fcf04651d0edc3de72b04ae2bcd9289c81614" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-controllers" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + +[[package]] +name = "cw721-roles" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-cw721-extensions", + "serde", + "thiserror", +] + +[[package]] +name = "dao-cw-orch" +version = "2.5.0" +dependencies = [ + "btsg-ft-factory", + "cosmwasm-std", + "cw-admin-factory", + "cw-fund-distributor", + "cw-orch", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", + "cw20-stake 2.5.0", + "cw20-stake-external-rewards", + "cw20-stake-reward-distributor", + "cw721-base 0.18.0", + "cw721-roles", + "dao-dao-core", + "dao-interface 2.5.0", + "dao-migrator", + "dao-pre-propose-approval-single", + "dao-pre-propose-approver", + "dao-pre-propose-multiple", + "dao-pre-propose-single", + "dao-proposal-condorcet", + "dao-proposal-hook-counter", + "dao-proposal-multiple", + "dao-proposal-single", + "dao-proposal-sudo", + "dao-rewards-distributor", + "dao-test-custom-factory", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", + "dao-voting-cw4", + "dao-voting-cw721-roles", + "dao-voting-cw721-staked", + "dao-voting-token-staked", + "serde", +] + +[[package]] +name = "dao-cw721-extensions" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw4 1.1.2", +] + +[[package]] +name = "dao-dao-core" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-dao-macros" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c3f39b7aaf9d913d0de8c8742c151011da00662acdbe95c33a5f7bad1b835a" +dependencies = [ + "cosmwasm-schema", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dao-dao-macros" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dao-hooks" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw4 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-interface" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e546da3e3d9c3b9f607c40256561f0424715d0aef840df9d37669b55d8590e1a" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + +[[package]] +name = "dao-interface" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + +[[package]] +name = "dao-migrator" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-orch", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "cw20-stake 2.5.0", + "cw20-staked-balance-voting", + "cw4 0.13.4", + "cw4-voting", + "dao-dao-core", + "dao-interface 2.5.0", + "dao-proposal-single", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "dao-voting-cw20-staked", + "dao-voting-cw4", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-approval-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-approver" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-approval-single", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-pre-propose-base" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd285523d7dea35a0dd76f0a5f20c190935922a7b58fe0ec753eb407e68d718b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-hooks 2.4.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.4.2", + "dao-voting 2.4.1", + "serde", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-base" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-denom 2.5.0", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.4.1", + "dao-voting 2.4.1", + "dao-voting 2.5.0", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-multiple" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-pre-propose-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-proposal-condorcet" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-hook-counter" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-hooks", + "thiserror", +] + +[[package]] +name = "dao-proposal-multiple" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-pre-propose-multiple", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw-orch", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-sudo" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-rewards-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw4 1.1.2", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-test-custom-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442d770933e3b3ecab4cfb4d6e9d054082b007d35fda3cf0c3d3ddd1cfa91782" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945898e8e168eada7ed06fa713d679e541673ee0dd8c70aee8d1f224ccd031a0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.4.2", + "dao-interface 2.4.2", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw20-balance" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw20-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw4" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw4-group 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw721-roles" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers", + "dao-cw721-extensions", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw721-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-token-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-lock" +version = "2.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "eyre", + "paste", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkd32" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" +dependencies = [ + "hmac", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "sha2 0.10.8", + "subtle-encoding", + "zeroize", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexable-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70922e1e0e68d99ec1a24446c70756cc3e56deaddb505b1f4b43914522d809" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "osmosis-std" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d7aa053bc3fad557ac90a0377688b400c395e2537f0f1de3293a15cad2e970" +dependencies = [ + "chrono", + "cosmwasm-std", + "osmosis-std-derive", + "prost 0.11.9", + "prost-types 0.11.9", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "osmosis-std-derive" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" +dependencies = [ + "itertools 0.10.5", + "proc-macro2", + "prost-types 0.11.9", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proposal-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a2f15b848398bad689771b35313c7e7095e772d444e299dbdb54b906691f8a" +dependencies = [ + "cosmwasm-std", + "indexable-hooks", + "schemars", + "serde", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.72", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scripts" +version = "2.5.0" +dependencies = [ + "btsg-ft-factory", + "cw-admin-factory", + "cw-orch", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", + "cw721-roles", + "dao-cw-orch", + "dao-interface 2.5.0", + "dao-migrator", + "dao-proposal-single", + "dao-proposal-sudo", + "dao-voting 2.5.0", + "dotenv", + "pretty_env_logger", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-cw-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75d32da6b8ed758b7d850b6c3c08f1d7df51a4df3cb201296e63e34a78e99d4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stake-cw20-external-rewards" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9bbc1e4b7a932957a05a76921015a849b234c3f25e59fe1fd0d2eab71654bc" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "stake-cw20-reward-distributor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4260ff7aec6dddb43cb5f1104ef5cebe2787853bc83af9172ce5b828b577c4c5" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tendermint" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519", + "ed25519-consensus", + "flex-error", + "futures", + "k256", + "num-traits", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto 0.34.1", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-config" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + +[[package]] +name = "tendermint-proto" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.4.2", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-rpc" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "peg", + "pin-project", + "rand", + "reqwest", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto 0.34.1", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uid" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vote-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef617ad17edd195f8a3bce72498bfcc406a27cecfc23828f562fa91a3e2fb141" +dependencies = [ + "cosmwasm-std", + "indexable-hooks", + "schemars", + "serde", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.72", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wynd-utils" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa37b3fba808df599acc6f0d7523b465baf47a0b0361867c4f1635eb53f72aa" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] \ No newline at end of file diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index b17475577..2d97e4d98 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -29,7 +29,7 @@ impl cw_orch::contract::Deploy for AdminFactorySuite fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: AdminFactorySuite = AdminFactorySuite::store_on(chain.clone()).unwrap(); + let suite: AdminFactorySuite = AdminFactorySuite::store_on(chain.clone())?; suite.factory.instantiate( &cw_admin_factory::msg::InstantiateMsg { admin: None }, None, @@ -67,12 +67,12 @@ impl cw_orch::contract::Deploy for PayrollSuite { fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: PayrollSuite = PayrollSuite::store_on(chain.clone()).unwrap(); + let suite: PayrollSuite = PayrollSuite::store_on(chain.clone())?; // ########### Instantiate ############## let _init = suite.payroll.instantiate( &cw_payroll_factory::msg::InstantiateMsg { owner: Some(chain.sender_addr().to_string()), - vesting_code_id: suite.vesting.code_id().unwrap(), + vesting_code_id: suite.vesting.code_id()?, }, None, None, @@ -110,7 +110,7 @@ impl cw_orch::contract::Deploy for TokenSwapSuite { fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: TokenSwapSuite = TokenSwapSuite::store_on(chain.clone()).unwrap(); + let suite: TokenSwapSuite = TokenSwapSuite::store_on(chain.clone())?; Ok(suite) } } @@ -142,7 +142,7 @@ impl cw_orch::contract::Deploy for TokenFactorySuite fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone()).unwrap(); + let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone())?; Ok(suite) } } @@ -174,7 +174,7 @@ impl cw_orch::contract::Deploy for VestingSuite { fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: VestingSuite = VestingSuite::store_on(chain.clone()).unwrap(); + let suite: VestingSuite = VestingSuite::store_on(chain.clone())?; Ok(suite) } } @@ -206,7 +206,7 @@ impl cw_orch::contract::Deploy for Cw721RolesSuite { fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: Cw721RolesSuite = Cw721RolesSuite::store_on(chain.clone()).unwrap(); + let suite: Cw721RolesSuite = Cw721RolesSuite::store_on(chain.clone())?; // ########### Instantiate ############## Ok(suite) } @@ -239,7 +239,7 @@ impl cw_orch::contract::Deploy for DaoMigrationSuite fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: DaoMigrationSuite = DaoMigrationSuite::store_on(chain.clone()).unwrap(); + let suite: DaoMigrationSuite = DaoMigrationSuite::store_on(chain.clone())?; // ########### Instantiate ############## Ok(suite) @@ -274,7 +274,7 @@ impl cw_orch::contract::Deploy for FantokenFactorySuite Result { // ########### Upload ############## let suite: FantokenFactorySuite = - FantokenFactorySuite::store_on(chain.clone()).unwrap(); + FantokenFactorySuite::store_on(chain.clone())?; // ########### Instantiate ############## suite.factory.instantiate(&InstantiateMsg {}, None, None)?; Ok(suite) From f5b9df58f6f334ab7617908c6dd8c2e4243f3fad Mon Sep 17 00:00:00 2001 From: hard-nett Date: Wed, 24 Jul 2024 22:49:38 +0000 Subject: [PATCH 37/50] cargo lock --- scripts/Cargo.lock | 4850 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4850 insertions(+) create mode 100644 scripts/Cargo.lock diff --git a/scripts/Cargo.lock b/scripts/Cargo.lock new file mode 100644 index 000000000..64c12b765 --- /dev/null +++ b/scripts/Cargo.lock @@ -0,0 +1,4850 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "abstract-cw-multi-test" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c77f8d4bac08f74fbc4fce8943cb2d35e742682b6cae8cb65555d6cd3830feb" +dependencies = [ + "anyhow", + "bech32 0.11.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20-ics20", + "derivative", + "hex", + "itertools 0.12.1", + "log", + "prost 0.12.3", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58", + "hmac", + "k256", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "bitcoin" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" +dependencies = [ + "bech32 0.9.1", + "bitcoin-private", + "bitcoin_hashes", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", +] + +[[package]] +name = "btsg-ft-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +dependencies = [ + "serde", +] + +[[package]] +name = "cc" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", + "tonic", +] + +[[package]] +name = "cosmos-sdk-proto" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.35.0", +] + +[[package]] +name = "cosmrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" +dependencies = [ + "bip32", + "cosmos-sdk-proto 0.20.0", + "ecdsa", + "eyre", + "k256", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", + "tokio", +] + +[[package]] +name = "cosmwasm-crypto" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd50718a2b6830ce9eb5d465de5a018a12e71729d66b70807ce97e6dd14f931d" +dependencies = [ + "digest 0.10.7", + "ecdsa", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "242e98e7a231c122e08f300d9db3262d1007b51758a8732cd6210b3e9faa4f3a" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7879036156092ad1c22fe0d7316efc5a5eceec2bc3906462a2560215f2a2f929" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb57855fbfc83327f8445ae0d413b1a05ac0d68c396ab4d122b2abd7bb82cb6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c1556156fdf892a55cced6115968b961eaaadd6f724a2c2cb7d1e168e32dd3" +dependencies = [ + "base64 0.21.7", + "bech32 0.9.1", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66de2ab9db04757bcedef2b5984fbe536903ada4a8a9766717a4a71197ef34f6" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + +[[package]] +name = "cw-admin-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-controllers" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f0bc6019b4d3d81e11f5c384bcce7173e2210bd654d75c6c9668e12cca05dfa" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-controllers" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57de8d3761e46be863e3ac1eba8c8a976362a48c6abf240df1e26c3e421ee9e8" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468b8f2696f625c8e15b5468f9420c8eabfaf23cb4fd7e6c660fc7e0cc8d77b8" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-paginate-storage 0.1.0", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw721 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-core-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c93e684945473777ebed2bcaf9f0af2291653f79d5c81774c6826350ba6d88de" +dependencies = [ + "cosmwasm-std", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw2 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw-core-interface" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "cosmwasm-std", + "cw-core-macros 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw2 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw-core-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f20a77489d2dc8a1c12cb0b9671b6cbdca88f12fe65e1a4ee9899490f7669dcc" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-core-macros" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-denom" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decaa8be7ffa8090dc62d8bb8ee97cd3f41f815a41ba08de1d40cacef6c3cb4b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-denom" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-fund-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-stake 2.5.0", + "dao-interface 2.5.0", + "dao-voting-cw20-staked", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "097ee97b99ecc90372eac3bcaf698d940a15f806f2ba1e1e901c729f6523e16e" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + +[[package]] +name = "cw-hooks" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "thiserror", +] + +[[package]] +name = "cw-orch" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" +dependencies = [ + "anyhow", + "cosmrs", + "cosmwasm-std", + "cw-orch-contract-derive", + "cw-orch-core", + "cw-orch-daemon", + "cw-orch-fns-derive", + "cw-orch-mock", + "cw-orch-networks", + "cw-orch-traits", + "cw-utils 1.0.3", + "hex", + "log", + "schemars", + "serde", + "thiserror", + "tokio", +] + +[[package]] +name = "cw-orch-contract-derive" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc8ba75692fc7bd30e91c78fad2dc208a738e4e6ea26b232f9352c320e35543" +dependencies = [ + "convert_case", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "cw-orch-core" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abd640f67f655411542a3c148769270c7a9e63d4097c2dc4a1f6edf23b7a9b4" +dependencies = [ + "abstract-cw-multi-test", + "anyhow", + "cosmos-sdk-proto 0.21.1", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "dirs", + "log", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "cw-orch-daemon" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" +dependencies = [ + "anyhow", + "async-recursion", + "base16", + "base64 0.22.1", + "bitcoin", + "chrono", + "cosmrs", + "cosmwasm-std", + "cw-orch-core", + "cw-orch-networks", + "cw-orch-traits", + "dirs", + "ed25519-dalek", + "eyre", + "file-lock", + "flate2", + "hex", + "hkd32", + "lazy_static", + "log", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "rand_core 0.6.4", + "reqwest", + "ring", + "ripemd", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "tokio", + "tonic", + "uid", +] + +[[package]] +name = "cw-orch-fns-derive" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e21b23116a0702f540d7fa3f16e8276682d860b589fed56259220ad59d768e" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-orch-mock" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57beb30d841bde79df51c9402741ef926ca8ef7ecd3570aa180074f767ac04d3" +dependencies = [ + "abstract-cw-multi-test", + "cosmwasm-std", + "cw-orch-core", + "cw-utils 1.0.3", + "log", + "serde", + "sha2 0.10.8", +] + +[[package]] +name = "cw-orch-networks" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" +dependencies = [ + "cw-orch-core", + "serde", +] + +[[package]] +name = "cw-orch-traits" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e6b81dc282724c9c6334a499f4867e575458e69fe5b99034d4f962860f3357" +dependencies = [ + "cw-orch-core", + "prost 0.12.3", + "prost-types 0.12.3", +] + +[[package]] +name = "cw-ownable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093dfb4520c48b5848274dd88ea99e280a04bc08729603341c7fb0d758c74321" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like", + "cw-ownable-derive", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + +[[package]] +name = "cw-ownable-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d3bf2e0f341bb6cc100d7d441d31cf713fbd3ce0c511f91e79f14b40a889af" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cw-paginate-storage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b854833e07c557dee02d1b61a21bb0731743bb2e3bbdc3e446a0d8a38af40ec4" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 0.13.4", + "serde", +] + +[[package]] +name = "cw-paginate-storage" +version = "2.5.0" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + +[[package]] +name = "cw-payroll-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-vesting", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-proposal-single" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6408483e1ac17a7e2b98ef6fa1379776964353bcbf501942d22ee1c1323117" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw3", + "dao-voting 0.1.0", + "indexable-hooks", + "proposal-hooks", + "schemars", + "serde", + "thiserror", + "vote-hooks", +] + +[[package]] +name = "cw-stake-tracker" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-wormhole", +] + +[[package]] +name = "cw-storage-plus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648b1507290bbc03a8d88463d7cd9b04b1fa0155e5eef366c4fa052b9caaac7a" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b6f91c0b94481a3e9ef1ceb183c37d00764f8751e39b45fc09f4d9b970d469" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-token-swap" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "thiserror", +] + +[[package]] +name = "cw-tokenfactory-issuer" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-types", + "cw2 1.1.2", + "dao-interface 2.5.0", + "osmosis-std", + "prost 0.12.3", + "prost-derive 0.12.3", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-tokenfactory-types" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "dao-interface 2.5.0", + "osmosis-std", + "osmosis-std-derive", + "prost 0.12.3", + "prost-derive 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "cw-utils" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbaecb78c8e8abfd6b4258c7f4fbeb5c49a5e45ee4d910d3240ee8e1d714e1b" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 0.16.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-vesting" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-orch", + "cw-ownable", + "cw-stake-tracker", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw-wormhole", + "cw2 1.1.2", + "cw20 1.1.2", + "serde", + "thiserror", + "wynd-utils", +] + +[[package]] +name = "cw-wormhole" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "serde", +] + +[[package]] +name = "cw2" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cf4639517490dd36b333bbd6c4fbd92e325fd0acf4683b41753bc5eb63bfc1" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cb782b8f110819a4eb5dbbcfed25ffba49ec16bbe32b4ad8da50a5ce68fec05" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526e39bb20534e25a1cd0386727f0038f4da294e5e535729ba3ef54055246abd" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", +] + +[[package]] +name = "cw20-base" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0306e606581f4fb45e82bcbb7f0333179ed53dd949c6523f01a99b4bfc1475a0" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-base" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ad79e86ea3707229bf78df94e08732e8f713207b4a77b2699755596725e7d9" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "cw20 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-ics20" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76221201da08fed611c857ea3aa21c031a4a7dc771a8b1750559ca987335dc02" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-stake" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f0d51ce27a97b51f66d737183845bc6d82f46f4b246dc959d1265d86906ccc" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20-stake" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-ownable", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "dao-hooks", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "cw20-stake-external-rewards" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "dao-hooks", + "stake-cw20-external-rewards", + "thiserror", +] + +[[package]] +name = "cw20-stake-reward-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "stake-cw20-reward-distributor", + "thiserror", +] + +[[package]] +name = "cw20-staked-balance-voting" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf8c2ee92372d35c3a48fd6ddd490a1a4426902748017dd0b7f551d06484e28" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-core-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw3" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe19462a7f644ba60c19d3443cb90d00c50d9b6b3b0a3a7fca93df8261af979b" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw4" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0acc3549d5ce11c6901b3a676f2e2628684722197054d97cd0101ea174ed5cbd" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw4" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24754ff6e45f2a1c60adc409d9b2eb87666012c44021329141ffaab3388fccd2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "serde", +] + +[[package]] +name = "cw4-group" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c95c89153e7831c8306c8eba40a3daa76f9c7b8f5179dd0b8628aca168ec7a" +dependencies = [ + "cosmwasm-std", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw4 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw4-group" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a22c3af54c52edf528673b420a67a1648be2c159b8ec778d2fbf543df24b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw4-voting" +version = "0.1.0" +source = "git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0#e531c760a5d057329afd98d62567aaa4dca2c96f" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-core-macros 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw4 0.13.4", + "cw4-group 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035818368a74c07dd9ed5c5a93340199ba251530162010b9f34c3809e3b97df1" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c4d286625ccadc957fe480dd3bdc54ada19e0e6b5b9325379db3130569e914" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", +] + +[[package]] +name = "cw721-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-base" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da518d9f68bfda7d972cbaca2e8fcf04651d0edc3de72b04ae2bcd9289c81614" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-controllers" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + +[[package]] +name = "cw721-roles" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-cw721-extensions", + "serde", + "thiserror", +] + +[[package]] +name = "dao-cw-orch" +version = "2.5.0" +dependencies = [ + "btsg-ft-factory", + "cosmwasm-std", + "cw-admin-factory", + "cw-fund-distributor", + "cw-orch", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", + "cw20-stake 2.5.0", + "cw20-stake-external-rewards", + "cw20-stake-reward-distributor", + "cw721-base 0.18.0", + "cw721-roles", + "dao-dao-core", + "dao-interface 2.5.0", + "dao-migrator", + "dao-pre-propose-approval-single", + "dao-pre-propose-approver", + "dao-pre-propose-multiple", + "dao-pre-propose-single", + "dao-proposal-condorcet", + "dao-proposal-hook-counter", + "dao-proposal-multiple", + "dao-proposal-single", + "dao-proposal-sudo", + "dao-rewards-distributor", + "dao-test-custom-factory", + "dao-voting-cw20-balance", + "dao-voting-cw20-staked", + "dao-voting-cw4", + "dao-voting-cw721-roles", + "dao-voting-cw721-staked", + "dao-voting-token-staked", + "serde", +] + +[[package]] +name = "dao-cw721-extensions" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw4 1.1.2", +] + +[[package]] +name = "dao-dao-core" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-dao-macros" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c3f39b7aaf9d913d0de8c8742c151011da00662acdbe95c33a5f7bad1b835a" +dependencies = [ + "cosmwasm-schema", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dao-dao-macros" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dao-hooks" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw4 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-interface" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e546da3e3d9c3b9f607c40256561f0424715d0aef840df9d37669b55d8590e1a" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + +[[package]] +name = "dao-interface" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw721 0.18.0", + "osmosis-std", +] + +[[package]] +name = "dao-migrator" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-core", + "cw-core-interface 0.1.0 (git+https://github.com/DA0-DA0/dao-contracts.git?tag=v1.0.0)", + "cw-orch", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 0.13.4", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 0.2.6", + "cw20-stake 2.5.0", + "cw20-staked-balance-voting", + "cw4 0.13.4", + "cw4-voting", + "dao-dao-core", + "dao-interface 2.5.0", + "dao-proposal-single", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "dao-voting-cw20-staked", + "dao-voting-cw4", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-approval-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-paginate-storage 2.5.0", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-approver" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-approval-single", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-pre-propose-base" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd285523d7dea35a0dd76f0a5f20c190935922a7b58fe0ec753eb407e68d718b" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-hooks 2.4.2", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.4.2", + "dao-voting 2.4.1", + "serde", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-base" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-denom 2.5.0", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.4.1", + "dao-voting 2.4.1", + "dao-voting 2.5.0", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "dao-pre-propose-multiple" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-pre-propose-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "dao-pre-propose-base 2.5.0", + "dao-voting 2.5.0", +] + +[[package]] +name = "dao-proposal-condorcet" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-hook-counter" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-hooks", + "thiserror", +] + +[[package]] +name = "dao-proposal-multiple" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-pre-propose-multiple", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-single" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-hooks 2.5.0", + "cw-orch", + "cw-proposal-single", + "cw-storage-plus 1.2.0", + "cw-utils 0.13.4", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-pre-propose-base 2.5.0", + "dao-voting 0.1.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-proposal-sudo" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-rewards-distributor" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw4 1.1.2", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-test-custom-factory" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442d770933e3b3ecab4cfb4d6e9d054082b007d35fda3cf0c3d3ddd1cfa91782" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945898e8e168eada7ed06fa713d679e541673ee0dd8c70aee8d1f224ccd031a0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.4.1", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.4.2", + "dao-interface 2.4.2", + "thiserror", +] + +[[package]] +name = "dao-voting" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-denom 2.5.0", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw20 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw20-balance" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw20-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw20 1.1.2", + "cw20-base 1.1.2", + "cw20-stake 2.5.0", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw4" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw4-group 1.1.2", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw721-roles" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw4 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers", + "dao-cw721-extensions", + "dao-dao-macros 2.5.0", + "dao-interface 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-cw721-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "cw721-controllers", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "dao-voting-token-staked" +version = "2.5.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers 1.1.2", + "cw-hooks 2.5.0", + "cw-orch", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-tokenfactory-issuer", + "cw-utils 1.0.3", + "cw2 1.1.2", + "dao-dao-macros 2.5.0", + "dao-hooks", + "dao-interface 2.5.0", + "dao-voting 2.5.0", + "thiserror", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-lock" +version = "2.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "eyre", + "paste", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkd32" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" +dependencies = [ + "hmac", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "sha2 0.10.8", + "subtle-encoding", + "zeroize", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexable-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70922e1e0e68d99ec1a24446c70756cc3e56deaddb505b1f4b43914522d809" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "osmosis-std" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d7aa053bc3fad557ac90a0377688b400c395e2537f0f1de3293a15cad2e970" +dependencies = [ + "chrono", + "cosmwasm-std", + "osmosis-std-derive", + "prost 0.11.9", + "prost-types 0.11.9", + "schemars", + "serde", + "serde-cw-value", +] + +[[package]] +name = "osmosis-std-derive" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ebdfd1bc8ed04db596e110c6baa9b174b04f6ed1ec22c666ddc5cb3fa91bd7" +dependencies = [ + "itertools 0.10.5", + "proc-macro2", + "prost-types 0.11.9", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proposal-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a2f15b848398bad689771b35313c7e7095e772d444e299dbdb54b906691f8a" +dependencies = [ + "cosmwasm-std", + "indexable-hooks", + "schemars", + "serde", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.72", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scripts" +version = "2.5.0" +dependencies = [ + "btsg-ft-factory", + "cw-admin-factory", + "cw-orch", + "cw-payroll-factory", + "cw-token-swap", + "cw-tokenfactory-issuer", + "cw-vesting", + "cw721-roles", + "dao-cw-orch", + "dao-interface 2.5.0", + "dao-migrator", + "dao-proposal-single", + "dao-proposal-sudo", + "dao-voting 2.5.0", + "dotenv", + "pretty_env_logger", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-cw-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75d32da6b8ed758b7d850b6c3c08f1d7df51a4df3cb201296e63e34a78e99d4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stake-cw20-external-rewards" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9bbc1e4b7a932957a05a76921015a849b234c3f25e59fe1fd0d2eab71654bc" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-controllers 0.13.4", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "stake-cw20-reward-distributor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4260ff7aec6dddb43cb5f1104ef5cebe2787853bc83af9172ce5b828b577c4c5" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus 0.13.4", + "cw-utils 0.13.4", + "cw2 0.13.4", + "cw20 0.13.4", + "cw20-base 0.13.4", + "cw20-stake 0.2.6", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tendermint" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519", + "ed25519-consensus", + "flex-error", + "futures", + "k256", + "num-traits", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto 0.34.1", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-config" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + +[[package]] +name = "tendermint-proto" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.4.2", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-rpc" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "peg", + "pin-project", + "rand", + "reqwest", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto 0.34.1", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uid" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vote-hooks" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef617ad17edd195f8a3bce72498bfcc406a27cecfc23828f562fa91a3e2fb141" +dependencies = [ + "cosmwasm-std", + "indexable-hooks", + "schemars", + "serde", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.72", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wynd-utils" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa37b3fba808df599acc6f0d7523b465baf47a0b0361867c4f1635eb53f72aa" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] From 0ae02a1dcc8f6c238479eed2d7929b5870848ab8 Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 24 Jul 2024 10:34:31 -0500 Subject: [PATCH 38/50] Remove dao-interface-master from scripts --- scripts/Cargo.lock | 1946 +------------------------------------------- scripts/Cargo.toml | 3 +- 2 files changed, 31 insertions(+), 1918 deletions(-) diff --git a/scripts/Cargo.lock b/scripts/Cargo.lock index 64c12b765..ee066dd86 100644 --- a/scripts/Cargo.lock +++ b/scripts/Cargo.lock @@ -27,21 +27,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" version = "0.7.8" @@ -62,143 +47,18 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async-trait" -version = "0.1.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" -[[package]] -name = "axum" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" -dependencies = [ - "async-trait", - "axum-core", - "bitflags 1.3.2", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "rustversion", - "tower-layer", - "tower-service", -] - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" - [[package]] name = "base16ct" version = "0.2.0" @@ -211,12 +71,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64ct" version = "1.6.0" @@ -235,56 +89,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" -[[package]] -name = "bip32" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" -dependencies = [ - "bs58", - "hmac", - "k256", - "rand_core 0.6.4", - "ripemd", - "sha2 0.10.8", - "subtle", - "zeroize", -] - -[[package]] -name = "bitcoin" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" -dependencies = [ - "bech32 0.9.1", - "bitcoin-private", - "bitcoin_hashes", - "hex_lit", - "secp256k1", -] - -[[package]] -name = "bitcoin-private" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" - -[[package]] -name = "bitcoin_hashes" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" -dependencies = [ - "bitcoin-private", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.6.0" @@ -315,15 +119,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2 0.10.8", -] - [[package]] name = "btsg-ft-factory" version = "2.5.0" @@ -343,12 +138,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - [[package]] name = "byteorder" version = "1.5.0" @@ -364,12 +153,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cc" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" - [[package]] name = "cfg-if" version = "1.0.0" @@ -382,12 +165,7 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", "num-traits", - "wasm-bindgen", - "windows-targets 0.52.6", ] [[package]] @@ -405,34 +183,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cosmos-sdk-proto" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" -dependencies = [ - "prost 0.12.3", - "prost-types 0.12.3", - "tendermint-proto 0.34.1", - "tonic", -] - [[package]] name = "cosmos-sdk-proto" version = "0.21.1" @@ -441,29 +191,7 @@ checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" dependencies = [ "prost 0.12.3", "prost-types 0.12.3", - "tendermint-proto 0.35.0", -] - -[[package]] -name = "cosmrs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" -dependencies = [ - "bip32", - "cosmos-sdk-proto 0.20.0", - "ecdsa", - "eyre", - "k256", - "rand_core 0.6.4", - "serde", - "serde_json", - "signature", - "subtle-encoding", - "tendermint", - "tendermint-rpc", - "thiserror", - "tokio", + "tendermint-proto", ] [[package]] @@ -519,7 +247,7 @@ version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c1556156fdf892a55cced6115968b961eaaadd6f724a2c2cb7d1e168e32dd3" dependencies = [ - "base64 0.21.7", + "base64", "bech32 0.9.1", "bnum", "cosmwasm-crypto", @@ -554,15 +282,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - [[package]] name = "crypto-bigint" version = "0.5.5" @@ -598,46 +317,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", - "subtle-ng", - "zeroize", -] - [[package]] name = "cw-address-like" version = "1.0.4" @@ -825,14 +504,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" dependencies = [ "anyhow", - "cosmrs", "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", - "cw-orch-daemon", "cw-orch-fns-derive", "cw-orch-mock", - "cw-orch-networks", "cw-orch-traits", "cw-utils 1.0.3", "hex", @@ -840,7 +516,6 @@ dependencies = [ "schemars", "serde", "thiserror", - "tokio", ] [[package]] @@ -862,7 +537,7 @@ checksum = "5abd640f67f655411542a3c148769270c7a9e63d4097c2dc4a1f6edf23b7a9b4" dependencies = [ "abstract-cw-multi-test", "anyhow", - "cosmos-sdk-proto 0.21.1", + "cosmos-sdk-proto", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -874,49 +549,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "cw-orch-daemon" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" -dependencies = [ - "anyhow", - "async-recursion", - "base16", - "base64 0.22.1", - "bitcoin", - "chrono", - "cosmrs", - "cosmwasm-std", - "cw-orch-core", - "cw-orch-networks", - "cw-orch-traits", - "dirs", - "ed25519-dalek", - "eyre", - "file-lock", - "flate2", - "hex", - "hkd32", - "lazy_static", - "log", - "once_cell", - "prost 0.12.3", - "prost-types 0.12.3", - "rand_core 0.6.4", - "reqwest", - "ring", - "ripemd", - "schemars", - "serde", - "serde_json", - "sha2 0.10.8", - "thiserror", - "tokio", - "tonic", - "uid", -] - [[package]] name = "cw-orch-fns-derive" version = "0.22.0" @@ -944,16 +576,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "cw-orch-networks" -version = "0.23.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" -dependencies = [ - "cw-orch-core", - "serde", -] - [[package]] name = "cw-orch-traits" version = "0.23.3" @@ -1998,6 +1620,7 @@ dependencies = [ "dao-hooks", "dao-interface 2.5.0", "dao-voting 2.5.0", + "semver", "thiserror", ] @@ -2280,52 +1903,14 @@ dependencies = [ "spki", ] -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "serde", - "signature", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", -] - [[package]] name = "ed25519-zebra" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", + "curve25519-dalek", + "hashbrown", "hex", "rand_core 0.6.4", "serde", @@ -2358,15 +1943,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_logger" version = "0.10.2" @@ -2381,40 +1957,8 @@ dependencies = [ ] [[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.13.0" +name = "ff" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ @@ -2422,139 +1966,21 @@ dependencies = [ "subtle", ] -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "file-lock" -version = "2.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "flex-error" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" dependencies = [ - "eyre", "paste", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-core", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2573,18 +1999,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - [[package]] name = "group" version = "0.13.0" @@ -2596,25 +2014,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -2624,12 +2023,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -2642,27 +2035,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hex_lit" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" - -[[package]] -name = "hkd32" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" -dependencies = [ - "hmac", - "once_cell", - "pbkdf2", - "rand_core 0.6.4", - "sha2 0.10.8", - "subtle-encoding", - "zeroize", -] - [[package]] name = "hmac" version = "0.12.1" @@ -2672,148 +2044,12 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "indexable-hooks" version = "0.1.0" @@ -2827,32 +2063,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - [[package]] name = "is-terminal" version = "0.4.12" @@ -2897,15 +2107,6 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "k256" version = "0.13.1" @@ -2920,12 +2121,6 @@ dependencies = [ "signature", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "libc" version = "0.2.155" @@ -2938,105 +2133,28 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags", "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" -dependencies = [ - "hermit-abi", - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -3057,15 +2175,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "object" -version = "0.36.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.19.0" @@ -3078,50 +2187,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -3157,109 +2222,12 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "peg" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" -dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-runtime" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs8" version = "0.10.2" @@ -3267,14 +2235,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + "spki", +] [[package]] name = "powerfmt" @@ -3282,12 +2244,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "pretty_env_logger" version = "0.5.0" @@ -3392,27 +2348,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - [[package]] name = "rand_core" version = "0.5.1" @@ -3428,15 +2363,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags 2.6.0", -] - [[package]] name = "redox_users" version = "0.4.5" @@ -3477,50 +2403,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -3531,131 +2413,12 @@ dependencies = [ "subtle", ] -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "schemars" version = "0.8.21" @@ -3680,19 +2443,12 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "scripts" version = "2.5.0" dependencies = [ "btsg-ft-factory", "cw-admin-factory", - "cw-orch", "cw-payroll-factory", "cw-token-swap", "cw-tokenfactory-issuer", @@ -3708,16 +2464,6 @@ dependencies = [ "pretty_env_logger", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sec1" version = "0.7.3" @@ -3732,48 +2478,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "bitcoin_hashes", - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.23" @@ -3849,29 +2553,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha2" version = "0.9.9" @@ -3896,15 +2577,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "signature" version = "2.2.0" @@ -3915,37 +2587,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.7.3" @@ -4007,143 +2648,35 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "tendermint" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" -dependencies = [ - "bytes", - "digest 0.10.7", - "ed25519", - "ed25519-consensus", - "flex-error", - "futures", - "k256", - "num-traits", - "once_cell", - "prost 0.12.3", - "prost-types 0.12.3", - "ripemd", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.10.8", - "signature", - "subtle", - "subtle-encoding", - "tendermint-proto 0.34.1", - "time", +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ "zeroize", ] [[package]] -name = "tendermint-config" -version = "0.34.1" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "flex-error", - "serde", - "serde_json", - "tendermint", - "toml", - "url", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "tendermint-proto" -version = "0.34.1" +name = "syn" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ - "bytes", - "flex-error", - "num-derive 0.3.3", - "num-traits", - "prost 0.12.3", - "prost-types 0.12.3", - "serde", - "serde_bytes", - "subtle-encoding", - "time", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -4154,7 +2687,7 @@ checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" dependencies = [ "bytes", "flex-error", - "num-derive 0.4.2", + "num-derive", "num-traits", "prost 0.12.3", "prost-types 0.12.3", @@ -4164,39 +2697,6 @@ dependencies = [ "time", ] -[[package]] -name = "tendermint-rpc" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" -dependencies = [ - "async-trait", - "bytes", - "flex-error", - "futures", - "getrandom", - "peg", - "pin-project", - "rand", - "reqwest", - "semver", - "serde", - "serde_bytes", - "serde_json", - "subtle", - "subtle-encoding", - "tendermint", - "tendermint-config", - "tendermint-proto 0.34.1", - "thiserror", - "time", - "tokio", - "tracing", - "url", - "uuid", - "walkdir", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -4235,7 +2735,6 @@ dependencies = [ "deranged", "num-conv", "powerfmt", - "serde", "time-core", "time-macros", ] @@ -4256,281 +2755,24 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "tonic" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.21.7", - "bytes", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost 0.12.3", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "tokio", - "tokio-rustls", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "uid" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "uuid" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.4" @@ -4549,107 +2791,12 @@ dependencies = [ "serde", ] -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "winapi-util" version = "0.1.8" @@ -4659,15 +2806,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4807,16 +2945,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wynd-utils" version = "0.4.1" @@ -4834,17 +2962,3 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 253537797..07baff47d 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -6,7 +6,6 @@ repository = "https://github.com/DA0-DA0/dao-contracts" version = "2.5.0" [dependencies] -cw-orch = { version = "0.24.1", features = ["daemon"] } dao-cw-orch = { path = "../packages/cw-orch", version = "2.5.0" } # scripts specific dotenv = { version = "0.15.0" } @@ -29,4 +28,4 @@ cw-tokenfactory-issuer = { path = "../contracts/external/cw-tokenfactory-issuer" cw-vesting = { path = "../contracts/external/cw-vesting" } cw721-roles = { path = "../contracts/external/cw721-roles" } dao-migrator = { path = "../contracts/external/dao-migrator" } -btsg-ft-factory = { path = "../contracts/external/btsg-ft-factory" } \ No newline at end of file +btsg-ft-factory = { path = "../contracts/external/btsg-ft-factory" } From 06bca643fa91f302f2e4fe47edca3aaef9a81ded Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 24 Jul 2024 10:37:57 -0500 Subject: [PATCH 39/50] Update external.rs --- scripts/src/tests/deploy/external.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 2d97e4d98..132c614da 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -143,6 +143,13 @@ impl cw_orch::contract::Deploy for TokenFactorySuite fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone())?; + + // ########### Instantiate ############## + // let init = TokenfactoryIssuerInit::NewToken { + // subdenom: "DAOTOKEN".into(), + // }; + // suite.tokenfactory.instantiate(&init, None, None)?; + Ok(suite) } } @@ -273,8 +280,7 @@ impl cw_orch::contract::Deploy for FantokenFactorySuite Result { // ########### Upload ############## - let suite: FantokenFactorySuite = - FantokenFactorySuite::store_on(chain.clone())?; + let suite: FantokenFactorySuite = FantokenFactorySuite::store_on(chain.clone())?; // ########### Instantiate ############## suite.factory.instantiate(&InstantiateMsg {}, None, None)?; Ok(suite) From c255d1ec1a6ec8727ce272ba5119cc1b593da292 Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 24 Jul 2024 11:58:59 -0500 Subject: [PATCH 40/50] Exclude scripts from workspace --- scripts/Cargo.lock | 2057 ++++++++++++++++++++++++++++++++++++++++++-- scripts/Cargo.toml | 1 + 2 files changed, 1998 insertions(+), 60 deletions(-) diff --git a/scripts/Cargo.lock b/scripts/Cargo.lock index ee066dd86..da0210caf 100644 --- a/scripts/Cargo.lock +++ b/scripts/Cargo.lock @@ -27,6 +27,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.7.8" @@ -47,18 +62,143 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base16ct" version = "0.2.0" @@ -71,6 +211,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -89,6 +235,56 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58", + "hmac", + "k256", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "bitcoin" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" +dependencies = [ + "bech32 0.9.1", + "bitcoin-private", + "bitcoin_hashes", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -119,6 +315,15 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", +] + [[package]] name = "btsg-ft-factory" version = "2.5.0" @@ -138,6 +343,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "byteorder" version = "1.5.0" @@ -146,13 +357,22 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" dependencies = [ "serde", ] +[[package]] +name = "cc" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb8dd288a69fc53a1996d7ecfbf4a20d59065bff137ce7e56bbd620de191189" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -165,7 +385,12 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -183,6 +408,34 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", + "tonic", +] + [[package]] name = "cosmos-sdk-proto" version = "0.21.1" @@ -191,17 +444,38 @@ checksum = "82e23f6ab56d5f031cde05b8b82a5fefd3a1a223595c79e32317a97189e612bc" dependencies = [ "prost 0.12.3", "prost-types 0.12.3", - "tendermint-proto", + "tendermint-proto 0.35.0", +] + +[[package]] +name = "cosmrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" +dependencies = [ + "bip32", + "cosmos-sdk-proto 0.20.0", + "ecdsa", + "eyre", + "k256", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", + "tokio", ] [[package]] name = "cosmwasm-crypto" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd50718a2b6830ce9eb5d465de5a018a12e71729d66b70807ce97e6dd14f931d" +checksum = "0f862b355f7e47711e0acfe6af92cb3fd8fd5936b66a9eaa338b51edabd1e77d" dependencies = [ "digest 0.10.7", - "ecdsa", "ed25519-zebra", "k256", "rand_core 0.6.4", @@ -210,18 +484,18 @@ dependencies = [ [[package]] name = "cosmwasm-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "242e98e7a231c122e08f300d9db3262d1007b51758a8732cd6210b3e9faa4f3a" +checksum = "cd85de6467cd1073688c86b39833679ae6db18cf4771471edd9809f15f1679f1" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7879036156092ad1c22fe0d7316efc5a5eceec2bc3906462a2560215f2a2f929" +checksum = "5b4cd28147a66eba73720b47636a58097a979ad8c8bfdb4ed437ebcbfe362576" dependencies = [ "cosmwasm-schema-derive", "schemars", @@ -232,9 +506,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb57855fbfc83327f8445ae0d413b1a05ac0d68c396ab4d122b2abd7bb82cb6" +checksum = "9acd45c63d41bc9b16bc6dc7f6bd604a8c2ad29ce96c8f3c96d7fc8ef384392e" dependencies = [ "proc-macro2", "quote", @@ -243,11 +517,11 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.5.5" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c1556156fdf892a55cced6115968b961eaaadd6f724a2c2cb7d1e168e32dd3" +checksum = "2685c2182624b2e9e17f7596192de49a3f86b7a0c9a5f6b25c1df5e24592e836" dependencies = [ - "base64", + "base64 0.21.7", "bech32 0.9.1", "bnum", "cosmwasm-crypto", @@ -275,13 +549,22 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -317,6 +600,46 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "cw-address-like" version = "1.0.4" @@ -504,11 +827,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c81cb500eb2f9be31a0f90c7ce66572ee4a790ffbae1c6b42ff2e3f9faf3479" dependencies = [ "anyhow", + "cosmrs", "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", + "cw-orch-daemon", "cw-orch-fns-derive", "cw-orch-mock", + "cw-orch-networks", "cw-orch-traits", "cw-utils 1.0.3", "hex", @@ -516,6 +842,7 @@ dependencies = [ "schemars", "serde", "thiserror", + "tokio", ] [[package]] @@ -526,7 +853,7 @@ checksum = "5bc8ba75692fc7bd30e91c78fad2dc208a738e4e6ea26b232f9352c320e35543" dependencies = [ "convert_case", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -537,7 +864,7 @@ checksum = "5abd640f67f655411542a3c148769270c7a9e63d4097c2dc4a1f6edf23b7a9b4" dependencies = [ "abstract-cw-multi-test", "anyhow", - "cosmos-sdk-proto", + "cosmos-sdk-proto 0.21.1", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -549,6 +876,49 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-orch-daemon" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e6d5033f1bf9d32a6d1b11dd8e9b9ad5cb673c3621def8fe63fa1310eda520" +dependencies = [ + "anyhow", + "async-recursion", + "base16", + "base64 0.22.1", + "bitcoin", + "chrono", + "cosmrs", + "cosmwasm-std", + "cw-orch-core", + "cw-orch-networks", + "cw-orch-traits", + "dirs", + "ed25519-dalek", + "eyre", + "file-lock", + "flate2", + "hex", + "hkd32", + "lazy_static", + "log", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "rand_core 0.6.4", + "reqwest", + "ring", + "ripemd", + "schemars", + "serde", + "serde_json", + "sha2 0.10.8", + "thiserror", + "tokio", + "tonic", + "uid", +] + [[package]] name = "cw-orch-fns-derive" version = "0.22.0" @@ -576,6 +946,16 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "cw-orch-networks" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b0e1af56869ced61c25f509a0a40cddd028779d838441b70f4578a8d7c0253" +dependencies = [ + "cw-orch-core", + "serde", +] + [[package]] name = "cw-orch-traits" version = "0.23.3" @@ -1903,14 +2283,52 @@ dependencies = [ "spki", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "ed25519-zebra" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ - "curve25519-dalek", - "hashbrown", + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "serde", @@ -1943,6 +2361,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -1957,30 +2384,180 @@ dependencies = [ ] [[package]] -name = "ff" -version = "0.13.0" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-lock" +version = "2.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "flate2" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flex-error" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" dependencies = [ + "eyre", "paste", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1999,10 +2576,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + [[package]] name = "group" version = "0.13.0" @@ -2014,6 +2599,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.4.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2023,18 +2627,51 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "hkd32" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e013a4f0b8772418eee1fc462e74017aba13c364a7b61bd3df1ddcbfe47b065" +dependencies = [ + "hmac", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "sha2 0.10.8", + "subtle-encoding", + "zeroize", +] + [[package]] name = "hmac" version = "0.12.1" @@ -2044,12 +2681,148 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexable-hooks" version = "0.1.0" @@ -2063,13 +2836,39 @@ dependencies = [ "thiserror", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -2107,11 +2906,20 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", @@ -2121,6 +2929,12 @@ dependencies = [ "signature", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.155" @@ -2133,28 +2947,105 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags", + "bitflags 2.6.0", "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num-derive" version = "0.4.2" @@ -2163,7 +3054,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2175,6 +3066,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -2187,6 +3087,50 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -2223,10 +3167,107 @@ dependencies = [ ] [[package]] -name = "paste" -version = "1.0.15" +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkcs8" @@ -2238,12 +3279,27 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "pretty_env_logger" version = "0.5.0" @@ -2318,7 +3374,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2348,6 +3404,27 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -2363,6 +3440,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -2376,9 +3462,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -2403,6 +3489,50 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -2413,12 +3543,131 @@ dependencies = [ "subtle", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "schemars" version = "0.8.21" @@ -2440,15 +3689,22 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.72", + "syn 2.0.74", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scripts" version = "2.5.0" dependencies = [ "btsg-ft-factory", "cw-admin-factory", + "cw-orch", "cw-payroll-factory", "cw-token-swap", "cw-tokenfactory-issuer", @@ -2464,6 +3720,16 @@ dependencies = [ "pretty_env_logger", ] +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sec1" version = "0.7.3" @@ -2478,6 +3744,48 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.23" @@ -2486,9 +3794,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" dependencies = [ "serde_derive", ] @@ -2522,13 +3830,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2539,15 +3847,39 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ + "form_urlencoded", "itoa", "ryu", "serde", @@ -2577,6 +3909,21 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -2587,6 +3934,37 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.7.3" @@ -2657,6 +4035,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -2670,13 +4054,116 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "tendermint" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519", + "ed25519-consensus", + "flex-error", + "futures", + "k256", + "num-traits", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto 0.34.1", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-config" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + +[[package]] +name = "tendermint-proto" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost 0.12.3", + "prost-types 0.12.3", + "serde", + "serde_bytes", + "subtle-encoding", + "time", ] [[package]] @@ -2687,7 +4174,7 @@ checksum = "ff525d5540a9fc535c38dc0d92a98da3ee36fcdfbda99cecb9f3cce5cd4d41d7" dependencies = [ "bytes", "flex-error", - "num-derive", + "num-derive 0.4.2", "num-traits", "prost 0.12.3", "prost-types 0.12.3", @@ -2697,6 +4184,39 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-rpc" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom", + "peg", + "pin-project", + "rand", + "reqwest", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto 0.34.1", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -2723,7 +4243,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2735,6 +4255,7 @@ dependencies = [ "deranged", "num-conv", "powerfmt", + "serde", "time-core", "time-macros", ] @@ -2755,29 +4276,286 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uid" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "281a11e4180ee68f8c06a7bf82d1be3c496e0debcadcc4576cc0b56132201edf" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vote-hooks" @@ -2791,19 +4569,124 @@ dependencies = [ "serde", ] +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.74", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -2824,6 +4707,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2945,6 +4837,16 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wynd-utils" version = "0.4.1" @@ -2957,8 +4859,43 @@ dependencies = [ "thiserror", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 07baff47d..04f82c92f 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -6,6 +6,7 @@ repository = "https://github.com/DA0-DA0/dao-contracts" version = "2.5.0" [dependencies] +cw-orch = { version = "0.24.1", features = ["daemon"] } dao-cw-orch = { path = "../packages/cw-orch", version = "2.5.0" } # scripts specific dotenv = { version = "0.15.0" } From 0cc80ced1b33f29a2e3d0eaba98e28c44975d5d6 Mon Sep 17 00:00:00 2001 From: hard-nett Date: Thu, 25 Jul 2024 00:42:30 +0000 Subject: [PATCH 41/50] cw-orch test suite for contracts --- .../src/distribution/cw_fund_distributor.rs | 4 +- packages/cw-orch/src/distribution/mod.rs | 2 +- packages/cw-orch/src/staking/cw20_stake.rs | 4 +- .../cw-orch/src/staking/external_rewards.rs | 4 +- packages/cw-orch/src/staking/mod.rs | 6 +- .../cw-orch/src/staking/reward_distributor.rs | 4 +- scripts/src/distribution.rs | 23 ++++++ scripts/src/lib.rs | 9 +++ scripts/src/propose.rs | 61 +++++++++++++++ scripts/src/staking.rs | 31 ++++++++ scripts/src/tests/deploy/distribution.rs | 37 +++++++++ scripts/src/tests/deploy/mod.rs | 4 + scripts/src/tests/deploy/propose.rs | 76 +++++++++++++++++++ scripts/src/tests/deploy/staking.rs | 38 ++++++++++ scripts/src/tests/deploy/voting.rs | 40 ++++++++++ scripts/src/tests/distribution/mod.rs | 15 ++++ scripts/src/tests/mod.rs | 4 + scripts/src/tests/propose/mod.rs | 16 ++++ scripts/src/tests/staking/mod.rs | 15 ++++ scripts/src/tests/voting/mod.rs | 15 ++++ scripts/src/voting.rs | 32 ++++++++ 21 files changed, 428 insertions(+), 12 deletions(-) create mode 100644 scripts/src/distribution.rs create mode 100644 scripts/src/propose.rs create mode 100644 scripts/src/staking.rs create mode 100644 scripts/src/tests/deploy/distribution.rs create mode 100644 scripts/src/tests/deploy/propose.rs create mode 100644 scripts/src/tests/deploy/staking.rs create mode 100644 scripts/src/tests/deploy/voting.rs create mode 100644 scripts/src/tests/distribution/mod.rs create mode 100644 scripts/src/tests/propose/mod.rs create mode 100644 scripts/src/tests/staking/mod.rs create mode 100644 scripts/src/tests/voting/mod.rs create mode 100644 scripts/src/voting.rs diff --git a/packages/cw-orch/src/distribution/cw_fund_distributor.rs b/packages/cw-orch/src/distribution/cw_fund_distributor.rs index 99f20355b..4ff63de15 100644 --- a/packages/cw-orch/src/distribution/cw_fund_distributor.rs +++ b/packages/cw-orch/src/distribution/cw_fund_distributor.rs @@ -4,9 +4,9 @@ use cw_fund_distributor::contract::{execute, instantiate, query}; use cw_fund_distributor::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] -pub struct CwFundDistributor; +pub struct DaoFundsDistributor; -impl Uploadable for CwFundDistributor { +impl Uploadable for DaoFundsDistributor { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() diff --git a/packages/cw-orch/src/distribution/mod.rs b/packages/cw-orch/src/distribution/mod.rs index c25661379..fb3e0fb50 100644 --- a/packages/cw-orch/src/distribution/mod.rs +++ b/packages/cw-orch/src/distribution/mod.rs @@ -1,5 +1,5 @@ mod cw_fund_distributor; mod dao_rewards_distributor; -pub use cw_fund_distributor::CwFundDistributor; +pub use cw_fund_distributor::DaoFundsDistributor; pub use dao_rewards_distributor::DaoRewardsDistributor; diff --git a/packages/cw-orch/src/staking/cw20_stake.rs b/packages/cw-orch/src/staking/cw20_stake.rs index 8b43d844c..03951004d 100644 --- a/packages/cw-orch/src/staking/cw20_stake.rs +++ b/packages/cw-orch/src/staking/cw20_stake.rs @@ -4,9 +4,9 @@ use cw20_stake::contract::{execute, instantiate, migrate, query}; use cw20_stake::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] -pub struct Cw20Stake; +pub struct DaoStakingCw20; -impl Uploadable for Cw20Stake { +impl Uploadable for DaoStakingCw20 { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() diff --git a/packages/cw-orch/src/staking/external_rewards.rs b/packages/cw-orch/src/staking/external_rewards.rs index 0d4f19c5c..ec1f584b0 100644 --- a/packages/cw-orch/src/staking/external_rewards.rs +++ b/packages/cw-orch/src/staking/external_rewards.rs @@ -4,9 +4,9 @@ use cw20_stake_external_rewards::contract::{execute, instantiate, migrate, query use cw20_stake_external_rewards::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] -pub struct Cw20StakeExternalRewards; +pub struct DaoStakingCw20ExternalRewards; -impl Uploadable for Cw20StakeExternalRewards { +impl Uploadable for DaoStakingCw20ExternalRewards { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() diff --git a/packages/cw-orch/src/staking/mod.rs b/packages/cw-orch/src/staking/mod.rs index 41808494c..1823256f6 100644 --- a/packages/cw-orch/src/staking/mod.rs +++ b/packages/cw-orch/src/staking/mod.rs @@ -2,6 +2,6 @@ mod cw20_stake; mod external_rewards; mod reward_distributor; -pub use cw20_stake::Cw20Stake; -pub use external_rewards::Cw20StakeExternalRewards; -pub use reward_distributor::Cw20StakeRewardDistributor; +pub use cw20_stake::DaoStakingCw20; +pub use external_rewards::DaoStakingCw20ExternalRewards; +pub use reward_distributor::DaoStakingCw20RewardDistributor; diff --git a/packages/cw-orch/src/staking/reward_distributor.rs b/packages/cw-orch/src/staking/reward_distributor.rs index 2f398ca81..1bb80bf82 100644 --- a/packages/cw-orch/src/staking/reward_distributor.rs +++ b/packages/cw-orch/src/staking/reward_distributor.rs @@ -4,9 +4,9 @@ use cw20_stake_reward_distributor::contract::{execute, instantiate, migrate, que use cw20_stake_reward_distributor::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)] -pub struct Cw20StakeRewardDistributor; +pub struct DaoStakingCw20RewardDistributor; -impl Uploadable for Cw20StakeRewardDistributor { +impl Uploadable for DaoStakingCw20RewardDistributor { /// Return the path to the wasm file corresponding to the contract fn wasm(_chain: &ChainInfoOwned) -> WasmPath { artifacts_dir_from_workspace!() diff --git a/scripts/src/distribution.rs b/scripts/src/distribution.rs new file mode 100644 index 000000000..81a7580a6 --- /dev/null +++ b/scripts/src/distribution.rs @@ -0,0 +1,23 @@ +use cw_orch::prelude::*; +use dao_cw_orch::*; + +// cw-funds-distributor +pub struct DaoDistributionSuite { + pub fund_distr: DaoFundsDistributor, + pub reward_distr: DaoRewardsDistributor, +} + +impl DaoDistributionSuite { + pub fn new(chain: Chain) -> DaoDistributionSuite { + DaoDistributionSuite:: { + fund_distr: DaoFundsDistributor::new("cw_funds_distributor", chain.clone()), + reward_distr: DaoRewardsDistributor::new("dao_rewards_distributor", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.fund_distr.upload()?; + self.reward_distr.upload()?; + Ok(()) + } +} diff --git a/scripts/src/lib.rs b/scripts/src/lib.rs index 99f646ded..61658e6de 100644 --- a/scripts/src/lib.rs +++ b/scripts/src/lib.rs @@ -3,8 +3,17 @@ fn main() {} mod dao; mod external; +mod distribution; +mod propose; +mod staking; +mod voting; + pub use dao::*; pub use external::*; +pub use distribution::*; +pub use propose::*; +pub use staking::*; +pub use voting::*; #[cfg(test)] mod tests; diff --git a/scripts/src/propose.rs b/scripts/src/propose.rs new file mode 100644 index 000000000..5618902a3 --- /dev/null +++ b/scripts/src/propose.rs @@ -0,0 +1,61 @@ +use cw_orch::prelude::*; +use dao_cw_orch::*; + +pub struct DaoPreProposeSuite { + pub pre_prop_approval_single: DaoPreProposeApprovalSingle, + pub pre_prop_approver: DaoPreProposeApprover, + pub pre_prop_multiple: DaoPreProposeMultiple, + pub pre_prop_single: DaoPreProposeSingle, +} + +impl DaoPreProposeSuite { + pub fn new(chain: Chain) -> DaoPreProposeSuite { + DaoPreProposeSuite:: { + pre_prop_approval_single: DaoPreProposeApprovalSingle::new( + "dao_pre_propose_approval_single", + chain.clone(), + ), + pre_prop_approver: DaoPreProposeApprover::new( + "dao_pre_propose_approver", + chain.clone(), + ), + pre_prop_multiple: DaoPreProposeMultiple::new( + "dao_pre_propose_multiple", + chain.clone(), + ), + pre_prop_single: DaoPreProposeSingle::new("dao_pre_propose_single", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.pre_prop_approval_single.upload()?; + self.pre_prop_approver.upload()?; + self.pre_prop_multiple.upload()?; + + Ok(()) + } +} + +pub struct DaoProposalSuite { + pub prop_single: DaoProposalSingle, + pub prop_multiple: DaoProposalMultiple, + pub prop_condocert: DaoProposalCondorcet, +} + +impl DaoProposalSuite { + pub fn new(chain: Chain) -> DaoProposalSuite { + DaoProposalSuite:: { + prop_single: DaoProposalSingle::new("dao_proposal_single", chain.clone()), + prop_multiple: DaoProposalMultiple::new("dao_proposal_multiple", chain.clone()), + prop_condocert: DaoProposalCondorcet::new("dao_proposal_condocert", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.prop_single.upload()?; + self.prop_multiple.upload()?; + self.prop_condocert.upload()?; + Ok(()) + } +} + diff --git a/scripts/src/staking.rs b/scripts/src/staking.rs new file mode 100644 index 000000000..f930fb518 --- /dev/null +++ b/scripts/src/staking.rs @@ -0,0 +1,31 @@ +use cw_orch::prelude::*; +use dao_cw_orch::*; + +pub struct DaoStakingSuite { + pub cw20_stake: DaoStakingCw20, + pub exteral_rewards: DaoStakingCw20ExternalRewards, + pub rewards_distributor: DaoStakingCw20RewardDistributor, +} + +impl DaoStakingSuite { + pub fn new(chain: Chain) -> DaoStakingSuite { + DaoStakingSuite:: { + cw20_stake: DaoStakingCw20::new("cw20_stake", chain.clone()), + exteral_rewards: DaoStakingCw20ExternalRewards::new( + "cw20_external_rewards", + chain.clone(), + ), + rewards_distributor: DaoStakingCw20RewardDistributor::new( + "cw20_reward_distributor", + chain.clone(), + ), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.cw20_stake.upload()?; + self.exteral_rewards.upload()?; + self.rewards_distributor.upload()?; + Ok(()) + } +} diff --git a/scripts/src/tests/deploy/distribution.rs b/scripts/src/tests/deploy/distribution.rs new file mode 100644 index 000000000..b7abe273f --- /dev/null +++ b/scripts/src/tests/deploy/distribution.rs @@ -0,0 +1,37 @@ +use crate::DaoDistributionSuite; +use cw_orch::prelude::*; + +// distribution suite +impl cw_orch::contract::Deploy for DaoDistributionSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoDistributionSuite::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![ + Box::new(&mut self.fund_distr), + Box::new(&mut self.reward_distr), + ] + } + + fn load_from(chain: Chain) -> Result { + let suite = Self::new(chain.clone()); + Ok(suite) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoDistributionSuite = DaoDistributionSuite::store_on(chain.clone())?; + Ok(suite) + } +} diff --git a/scripts/src/tests/deploy/mod.rs b/scripts/src/tests/deploy/mod.rs index 65972a8a9..84961f911 100644 --- a/scripts/src/tests/deploy/mod.rs +++ b/scripts/src/tests/deploy/mod.rs @@ -1 +1,5 @@ mod external; +mod distribution; +mod voting; +mod propose; +mod staking; diff --git a/scripts/src/tests/deploy/propose.rs b/scripts/src/tests/deploy/propose.rs new file mode 100644 index 000000000..fb519de54 --- /dev/null +++ b/scripts/src/tests/deploy/propose.rs @@ -0,0 +1,76 @@ +use crate::propose::*; +use cw_orch::prelude::*; + + +// pre-proposal suite +impl cw_orch::contract::Deploy for DaoPreProposeSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoPreProposeSuite::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![ + Box::new(&mut self.pre_prop_approval_single), + Box::new(&mut self.pre_prop_approver), + Box::new(&mut self.pre_prop_multiple), + Box::new(&mut self.pre_prop_single), + ] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoPreProposeSuite = DaoPreProposeSuite::store_on(chain.clone())?; + Ok(suite) + } +} + +// proposal suite +impl cw_orch::contract::Deploy for DaoProposalSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoProposalSuite::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![ + Box::new(&mut self.prop_single), + Box::new(&mut self.prop_multiple), + Box::new(&mut self.prop_condocert), + ] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoProposalSuite = DaoProposalSuite::store_on(chain.clone())?; + Ok(suite) + } +} diff --git a/scripts/src/tests/deploy/staking.rs b/scripts/src/tests/deploy/staking.rs new file mode 100644 index 000000000..f3f311460 --- /dev/null +++ b/scripts/src/tests/deploy/staking.rs @@ -0,0 +1,38 @@ +use crate::staking::*; +use cw_orch::prelude::*; + +// staking suite +impl cw_orch::contract::Deploy for DaoStakingSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoStakingSuite::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![ + Box::new(&mut self.cw20_stake), + Box::new(&mut self.exteral_rewards), + Box::new(&mut self.rewards_distributor), + ] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoStakingSuite = DaoStakingSuite::store_on(chain.clone())?; + Ok(suite) + } +} diff --git a/scripts/src/tests/deploy/voting.rs b/scripts/src/tests/deploy/voting.rs new file mode 100644 index 000000000..c64185de3 --- /dev/null +++ b/scripts/src/tests/deploy/voting.rs @@ -0,0 +1,40 @@ +use crate::voting::*; +use cw_orch::prelude::*; + +// staking suite +impl cw_orch::contract::Deploy for DaoVotingSuite { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoVotingSuite::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + vec![ + Box::new(&mut self.voting_cw4), + Box::new(&mut self.voting_cw20_staked), + Box::new(&mut self.voting_cw721_roles), + Box::new(&mut self.voting_cw721_staked), + Box::new(&mut self.voting_token_staked), + ] + } + + fn load_from(chain: Chain) -> Result { + let factory = Self::new(chain.clone()); + Ok(factory) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoVotingSuite = DaoVotingSuite::store_on(chain.clone())?; + Ok(suite) + } +} diff --git a/scripts/src/tests/distribution/mod.rs b/scripts/src/tests/distribution/mod.rs new file mode 100644 index 000000000..430209521 --- /dev/null +++ b/scripts/src/tests/distribution/mod.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + distribution::DaoDistributionSuite, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_distribution_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _app = DaoDistributionSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/mod.rs b/scripts/src/tests/mod.rs index 29d6e7e54..99a8bafb9 100644 --- a/scripts/src/tests/mod.rs +++ b/scripts/src/tests/mod.rs @@ -1,5 +1,9 @@ mod deploy; mod external; +mod voting; +mod staking; +mod distribution; +mod propose; pub(crate) const PREFIX: &str = "mock"; pub(crate) const ADMIN: &str = "admin"; diff --git a/scripts/src/tests/propose/mod.rs b/scripts/src/tests/propose/mod.rs new file mode 100644 index 000000000..fe74e0da9 --- /dev/null +++ b/scripts/src/tests/propose/mod.rs @@ -0,0 +1,16 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + propose::{DaoPreProposeSuite, DaoProposalSuite}, + tests::{ADMIN, PREFIX}, +}; + +#[test] +fn test_proposals_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _pre_prop_suite = DaoPreProposeSuite::deploy_on(mock.clone(), admin.clone())?; + let _props = DaoProposalSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/staking/mod.rs b/scripts/src/tests/staking/mod.rs new file mode 100644 index 000000000..b3c6db344 --- /dev/null +++ b/scripts/src/tests/staking/mod.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + tests::{ADMIN, PREFIX}, + DaoStakingSuite, +}; + +#[test] +fn test_staking_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _app = DaoStakingSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/voting/mod.rs b/scripts/src/tests/voting/mod.rs new file mode 100644 index 000000000..e7b24556a --- /dev/null +++ b/scripts/src/tests/voting/mod.rs @@ -0,0 +1,15 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::{ + tests::{ADMIN, PREFIX}, + DaoVotingSuite, +}; + +#[test] +fn test_voting_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _app = DaoVotingSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/voting.rs b/scripts/src/voting.rs new file mode 100644 index 000000000..d0b011499 --- /dev/null +++ b/scripts/src/voting.rs @@ -0,0 +1,32 @@ +use cw_orch::prelude::*; +use dao_cw_orch::*; + +pub struct DaoVotingSuite { + pub voting_cw4: DaoVotingCw4, + pub voting_cw20_staked: DaoVotingCw20Staked, + pub voting_cw721_roles: DaoVotingCw721Roles, + pub voting_cw721_staked: DaoVotingCw721Staked, + // pub voting_onft_staked: DaoVotingONftStaked, + pub voting_token_staked: DaoVotingTokenStaked, +} + +impl DaoVotingSuite { + pub fn new(chain: Chain) -> DaoVotingSuite { + DaoVotingSuite:: { + voting_cw4: DaoVotingCw4::new("voting_cw4", chain.clone()), + voting_cw20_staked: DaoVotingCw20Staked::new("voting_cw20_staked", chain.clone()), + voting_cw721_roles: DaoVotingCw721Roles::new("voting_cw721_roles", chain.clone()), + voting_cw721_staked: DaoVotingCw721Staked::new("voting_cw721_staked", chain.clone()), + voting_token_staked: DaoVotingTokenStaked::new("voting_token_staked", chain.clone()), + } + } + + pub fn upload(&self) -> Result<(), CwOrchError> { + self.voting_cw4.upload()?; + self.voting_cw20_staked.upload()?; + self.voting_cw721_roles.upload()?; + self.voting_cw721_staked.upload()?; + self.voting_token_staked.upload()?; + Ok(()) + } +} From 3990e13c3d64dc3dad6deafab08e2eb3910587ca Mon Sep 17 00:00:00 2001 From: hard-nett Date: Thu, 25 Jul 2024 02:08:47 +0000 Subject: [PATCH 42/50] dao cw-orch interface --- scripts/src/dao.rs | 30 +- scripts/src/external.rs | 167 ++--------- scripts/src/propose.rs | 9 +- scripts/src/tests/deploy/dao.rs | 42 +++ scripts/src/tests/deploy/external.rs | 275 +----------------- scripts/src/tests/deploy/mod.rs | 5 +- scripts/src/tests/deploy/propose.rs | 10 +- scripts/src/tests/external/admin_factory.rs | 15 - scripts/src/tests/external/btsg_ft_factory.rs | 15 - scripts/src/tests/external/cw721_roles.rs | 15 - scripts/src/tests/external/dao_migration.rs | 15 - scripts/src/tests/external/mod.rs | 13 + scripts/src/tests/external/payroll.rs | 15 - scripts/src/tests/external/token_swap.rs | 30 +- .../src/tests/external/tokenfactory_issuer.rs | 16 - scripts/src/tests/external/vesting.rs | 15 - scripts/src/tests/mod.rs | 25 +- 17 files changed, 165 insertions(+), 547 deletions(-) create mode 100644 scripts/src/tests/deploy/dao.rs diff --git a/scripts/src/dao.rs b/scripts/src/dao.rs index 144f03e57..533e85e13 100644 --- a/scripts/src/dao.rs +++ b/scripts/src/dao.rs @@ -1,27 +1,39 @@ use cw_orch::prelude::*; -use dao_cw_orch::{DaoDaoCore, DaoProposalSingle, DaoProposalSudo}; +use dao_cw_orch::DaoDaoCore; -// minimal dao +use crate::{ + DaoDistributionSuite, DaoExternalSuite, DaoProposalSuite, DaoStakingSuite, DaoVotingSuite, +}; + +// full dao suite pub struct DaoDao { pub dao_core: DaoDaoCore, - pub dao_proposal_single: DaoProposalSingle, - pub dao_proposal_sudo: DaoProposalSudo, + pub proposal_suite: DaoProposalSuite, + pub voting_suite: DaoVotingSuite, + pub staking_suite: DaoStakingSuite, + pub distribution_suite: DaoDistributionSuite, + pub external_suite: DaoExternalSuite, } impl DaoDao { pub fn new(chain: Chain) -> DaoDao { DaoDao:: { dao_core: DaoDaoCore::new("dao_dao_core", chain.clone()), - dao_proposal_single: DaoProposalSingle::new("dao_proposal_single", chain.clone()), - dao_proposal_sudo: DaoProposalSudo::new("dao_proposal_sudo", chain.clone()), + proposal_suite: DaoProposalSuite::new(chain.clone()), + voting_suite: DaoVotingSuite::new(chain.clone()), + staking_suite: DaoStakingSuite::new(chain.clone()), + distribution_suite: DaoDistributionSuite::new(chain.clone()), + external_suite: DaoExternalSuite::new(chain.clone()), } } pub fn upload(&self) -> Result<(), CwOrchError> { self.dao_core.upload()?; - self.dao_proposal_single.upload()?; - self.dao_proposal_sudo.upload()?; - + self.proposal_suite.upload()?; + self.voting_suite.upload()?; + self.staking_suite.upload()?; + self.distribution_suite.upload()?; + self.external_suite.upload()?; Ok(()) } } diff --git a/scripts/src/external.rs b/scripts/src/external.rs index a6331b0b9..b66c00ae1 100644 --- a/scripts/src/external.rs +++ b/scripts/src/external.rs @@ -1,152 +1,45 @@ use cw_orch::prelude::*; use dao_cw_orch::*; -// admin factory -pub struct AdminFactorySuite { - pub factory: DaoExternalAdminFactory, -} -impl AdminFactorySuite { - pub fn new(chain: Chain) -> AdminFactorySuite { - AdminFactorySuite:: { - factory: DaoExternalAdminFactory::new("cw_admin_factory", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.factory.upload()?; - - Ok(()) - } -} - -// bitsong fantoken factory -pub struct FantokenFactorySuite { - pub factory: DaoExternalFantokenFactory, -} - -impl FantokenFactorySuite { - pub fn new(chain: Chain) -> FantokenFactorySuite { - FantokenFactorySuite:: { - factory: DaoExternalFantokenFactory::new("btsg_ft_factory", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.factory.upload()?; - - Ok(()) - } -} - -// payroll factory -pub struct PayrollSuite { - pub payroll: DaoExternalPayrollFactory, - pub vesting: DaoExternalCwVesting, -} -impl PayrollSuite { - pub fn new(chain: Chain) -> PayrollSuite { - PayrollSuite:: { - payroll: DaoExternalPayrollFactory::new("cw_payroll", chain.clone()), - vesting: DaoExternalCwVesting::new("cw_vesting", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.payroll.upload()?; - self.vesting.upload()?; - Ok(()) - } -} - -// cw tokenswap -pub struct TokenSwapSuite { - pub tokenswap: DaoExternalTokenSwap, -} -impl TokenSwapSuite { - pub fn new(chain: Chain) -> TokenSwapSuite { - TokenSwapSuite:: { - tokenswap: DaoExternalTokenSwap::new("cw_tokenswap", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.tokenswap.upload()?; - - Ok(()) - } -} - -// cw-tokenfactory issuer -pub struct TokenFactorySuite { - pub tokenfactory: DaoExternalTokenfactoryIssuer, -} -impl TokenFactorySuite { - pub fn new(chain: Chain) -> TokenFactorySuite { - TokenFactorySuite:: { - tokenfactory: DaoExternalTokenfactoryIssuer::new("cw_tokenfactory", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.tokenfactory.upload()?; - - Ok(()) - } -} - -// cw-vesting -pub struct VestingSuite { - pub vesting: DaoExternalCwVesting, -} - -impl VestingSuite { - pub fn new(chain: Chain) -> VestingSuite { - VestingSuite:: { - vesting: DaoExternalCwVesting::new("dao_dao_core", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.vesting.upload()?; - - Ok(()) - } -} - -// cw721 roles -pub struct Cw721RolesSuite { - pub roles: DaoExternalCw721Roles, -} - -impl Cw721RolesSuite { - pub fn new(chain: Chain) -> Cw721RolesSuite { - Cw721RolesSuite:: { - roles: DaoExternalCw721Roles::new("cw721_roles", chain.clone()), - } - } - - pub fn upload(&self) -> Result<(), CwOrchError> { - self.roles.upload()?; - - Ok(()) - } -} - -// migrator -pub struct DaoMigrationSuite { +// external suite +pub struct DaoExternalSuite { + pub admin_factory: DaoExternalAdminFactory, + pub btsg_ft_factory: DaoExternalFantokenFactory, + pub payroll_factory: DaoExternalPayrollFactory, + pub cw_tokenswap: DaoExternalTokenSwap, + pub cw_tokenfactory_issuer: DaoExternalTokenfactoryIssuer, + pub cw_vesting: DaoExternalCwVesting, + pub cw721_roles: DaoExternalCw721Roles, pub migrator: DaoExternalMigrator, } -impl DaoMigrationSuite { - pub fn new(chain: Chain) -> DaoMigrationSuite { - DaoMigrationSuite:: { +impl DaoExternalSuite { + pub fn new(chain: Chain) -> DaoExternalSuite { + DaoExternalSuite:: { + admin_factory: DaoExternalAdminFactory::new("cw_admin_factory", chain.clone()), + btsg_ft_factory: DaoExternalFantokenFactory::new("btsg_ft_factory", chain.clone()), + payroll_factory: DaoExternalPayrollFactory::new("cw_payroll", chain.clone()), + cw_tokenswap: DaoExternalTokenSwap::new("cw_tokenswap", chain.clone()), + cw_tokenfactory_issuer: DaoExternalTokenfactoryIssuer::new( + "cw_tokenfactory", + chain.clone(), + ), + cw_vesting: DaoExternalCwVesting::new("cw_vesting", chain.clone()), + cw721_roles: DaoExternalCw721Roles::new("cw721_roles", chain.clone()), migrator: DaoExternalMigrator::new("dao_migrator", chain.clone()), } } pub fn upload(&self) -> Result<(), CwOrchError> { + self.admin_factory.upload()?; + self.btsg_ft_factory.upload()?; + self.payroll_factory.upload()?; + self.cw_tokenswap.upload()?; + self.cw_tokenfactory_issuer.upload()?; + self.cw_vesting.upload()?; + self.cw721_roles.upload()?; self.migrator.upload()?; Ok(()) } -} +} \ No newline at end of file diff --git a/scripts/src/propose.rs b/scripts/src/propose.rs index 5618902a3..6c72bb424 100644 --- a/scripts/src/propose.rs +++ b/scripts/src/propose.rs @@ -31,15 +31,19 @@ impl DaoPreProposeSuite { self.pre_prop_approval_single.upload()?; self.pre_prop_approver.upload()?; self.pre_prop_multiple.upload()?; + self.pre_prop_single.upload()?; Ok(()) } } +// proposal suite pub struct DaoProposalSuite { pub prop_single: DaoProposalSingle, pub prop_multiple: DaoProposalMultiple, pub prop_condocert: DaoProposalCondorcet, + pub prop_sudo: DaoProposalSudo, + pub pre_prop_suite: DaoPreProposeSuite, } impl DaoProposalSuite { @@ -48,6 +52,8 @@ impl DaoProposalSuite { prop_single: DaoProposalSingle::new("dao_proposal_single", chain.clone()), prop_multiple: DaoProposalMultiple::new("dao_proposal_multiple", chain.clone()), prop_condocert: DaoProposalCondorcet::new("dao_proposal_condocert", chain.clone()), + prop_sudo: DaoProposalSudo::new("dao_proposal_sudo", chain.clone()), + pre_prop_suite: DaoPreProposeSuite::new(chain.clone()), } } @@ -55,7 +61,8 @@ impl DaoProposalSuite { self.prop_single.upload()?; self.prop_multiple.upload()?; self.prop_condocert.upload()?; + self.prop_sudo.upload()?; + self.pre_prop_suite.upload()?; Ok(()) } } - diff --git a/scripts/src/tests/deploy/dao.rs b/scripts/src/tests/deploy/dao.rs new file mode 100644 index 000000000..94d579bfe --- /dev/null +++ b/scripts/src/tests/deploy/dao.rs @@ -0,0 +1,42 @@ +use crate::DaoDao; +use cw_orch::prelude::*; +// distribution suite +impl cw_orch::contract::Deploy for DaoDao { + // We don't have a custom error type + type Error = CwOrchError; + type DeployData = Addr; + + fn store_on(chain: Chain) -> Result { + let suite = DaoDao::new(chain.clone()); + suite.upload()?; + Ok(suite) + } + + fn deployed_state_file_path() -> Option { + None + } + + fn get_contracts_mut(&mut self) -> Vec>> { + let mut cs: Vec>> = vec![]; + let res: Vec>> = vec![Box::new(&mut self.dao_core)]; + + cs.extend(res); + cs.extend(self.distribution_suite.get_contracts_mut()); + cs.extend(self.proposal_suite.get_contracts_mut()); + cs.extend(self.staking_suite.get_contracts_mut()); + cs.extend(self.voting_suite.get_contracts_mut()); + cs.extend(self.external_suite.get_contracts_mut()); + cs + } + + fn load_from(chain: Chain) -> Result { + let suite = Self::new(chain.clone()); + Ok(suite) + } + + fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { + // ########### Upload ############## + let suite: DaoDao = DaoDao::store_on(chain.clone())?; + Ok(suite) + } +} diff --git a/scripts/src/tests/deploy/external.rs b/scripts/src/tests/deploy/external.rs index 132c614da..d09e2e8d3 100644 --- a/scripts/src/tests/deploy/external.rs +++ b/scripts/src/tests/deploy/external.rs @@ -1,288 +1,43 @@ use crate::external::*; -use btsg_ft_factory::msg::InstantiateMsg; use cw_orch::prelude::*; // admin factory -impl cw_orch::contract::Deploy for AdminFactorySuite { +impl cw_orch::contract::Deploy for DaoExternalSuite { // We don't have a custom error type type Error = CwOrchError; type DeployData = Addr; fn store_on(chain: Chain) -> Result { - let factory = AdminFactorySuite::new(chain.clone()); - factory.upload()?; - Ok(factory) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.factory)] - } - - fn load_from(chain: Chain) -> Result { - let factory = Self::new(chain.clone()); - Ok(factory) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: AdminFactorySuite = AdminFactorySuite::store_on(chain.clone())?; - suite.factory.instantiate( - &cw_admin_factory::msg::InstantiateMsg { admin: None }, - None, - None, - )?; + let suite = DaoExternalSuite::new(chain.clone()); + suite.upload()?; Ok(suite) } -} - -// payroll -impl cw_orch::contract::Deploy for PayrollSuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let payroll = PayrollSuite::new(chain.clone()); - payroll.upload()?; - - Ok(payroll) - } fn deployed_state_file_path() -> Option { None } fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.payroll)] + vec![ + Box::new(&mut self.admin_factory), + Box::new(&mut self.btsg_ft_factory), + Box::new(&mut self.payroll_factory), + Box::new(&mut self.cw_tokenswap), + Box::new(&mut self.cw_tokenfactory_issuer), + Box::new(&mut self.cw_vesting), + Box::new(&mut self.cw721_roles), + Box::new(&mut self.migrator), + ] } fn load_from(chain: Chain) -> Result { - let payroll = Self::new(chain.clone()); - Ok(payroll) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: PayrollSuite = PayrollSuite::store_on(chain.clone())?; - // ########### Instantiate ############## - let _init = suite.payroll.instantiate( - &cw_payroll_factory::msg::InstantiateMsg { - owner: Some(chain.sender_addr().to_string()), - vesting_code_id: suite.vesting.code_id()?, - }, - None, - None, - )?; - + let suite = Self::new(chain.clone()); Ok(suite) } -} - -// tokenswap - -impl cw_orch::contract::Deploy for TokenSwapSuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let tokenswap = TokenSwapSuite::new(chain.clone()); - tokenswap.upload()?; - Ok(tokenswap) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.tokenswap)] - } - - fn load_from(chain: Chain) -> Result { - let tokenswap = Self::new(chain.clone()); - Ok(tokenswap) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: TokenSwapSuite = TokenSwapSuite::store_on(chain.clone())?; - Ok(suite) - } -} - -// tokenfactory issuer -impl cw_orch::contract::Deploy for TokenFactorySuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let factory = TokenFactorySuite::new(chain.clone()); - factory.upload()?; - Ok(factory) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.tokenfactory)] - } - - fn load_from(chain: Chain) -> Result { - let factory = Self::new(chain.clone()); - Ok(factory) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: TokenFactorySuite = TokenFactorySuite::store_on(chain.clone())?; - - // ########### Instantiate ############## - // let init = TokenfactoryIssuerInit::NewToken { - // subdenom: "DAOTOKEN".into(), - // }; - // suite.tokenfactory.instantiate(&init, None, None)?; - - Ok(suite) - } -} - -// cw-vesting -impl cw_orch::contract::Deploy for VestingSuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let vesting = VestingSuite::new(chain.clone()); - vesting.upload()?; - Ok(vesting) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.vesting)] - } - - fn load_from(chain: Chain) -> Result { - let vesting = Self::new(chain.clone()); - Ok(vesting) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: VestingSuite = VestingSuite::store_on(chain.clone())?; - Ok(suite) - } -} - -// cw721-roles -impl cw_orch::contract::Deploy for Cw721RolesSuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let roles = Cw721RolesSuite::new(chain.clone()); - roles.upload()?; - Ok(roles) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.roles)] - } - - fn load_from(chain: Chain) -> Result { - let roles = Self::new(chain.clone()); - Ok(roles) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: Cw721RolesSuite = Cw721RolesSuite::store_on(chain.clone())?; - // ########### Instantiate ############## - Ok(suite) - } -} - -// dao-migrator -impl cw_orch::contract::Deploy for DaoMigrationSuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let migrator = DaoMigrationSuite::new(chain.clone()); - migrator.upload()?; - Ok(migrator) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.migrator)] - } - - fn load_from(chain: Chain) -> Result { - let migrator = Self::new(chain.clone()); - Ok(migrator) - } - - fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { - // ########### Upload ############## - let suite: DaoMigrationSuite = DaoMigrationSuite::store_on(chain.clone())?; - // ########### Instantiate ############## - - Ok(suite) - } -} - -// bitsong fantoken factory -impl cw_orch::contract::Deploy for FantokenFactorySuite { - // We don't have a custom error type - type Error = CwOrchError; - type DeployData = Addr; - - fn store_on(chain: Chain) -> Result { - let factory = FantokenFactorySuite::new(chain.clone()); - factory.upload()?; - Ok(factory) - } - - fn deployed_state_file_path() -> Option { - None - } - - fn get_contracts_mut(&mut self) -> Vec>> { - vec![Box::new(&mut self.factory)] - } - - fn load_from(chain: Chain) -> Result { - let factory = Self::new(chain.clone()); - Ok(factory) - } fn deploy_on(chain: Chain, _data: Self::DeployData) -> Result { // ########### Upload ############## - let suite: FantokenFactorySuite = FantokenFactorySuite::store_on(chain.clone())?; - // ########### Instantiate ############## - suite.factory.instantiate(&InstantiateMsg {}, None, None)?; + let suite: DaoExternalSuite = DaoExternalSuite::store_on(chain.clone())?; Ok(suite) } } diff --git a/scripts/src/tests/deploy/mod.rs b/scripts/src/tests/deploy/mod.rs index 84961f911..a8eca4033 100644 --- a/scripts/src/tests/deploy/mod.rs +++ b/scripts/src/tests/deploy/mod.rs @@ -1,5 +1,6 @@ -mod external; mod distribution; -mod voting; +mod dao; +mod external; mod propose; mod staking; +mod voting; diff --git a/scripts/src/tests/deploy/propose.rs b/scripts/src/tests/deploy/propose.rs index fb519de54..0c17d9c76 100644 --- a/scripts/src/tests/deploy/propose.rs +++ b/scripts/src/tests/deploy/propose.rs @@ -1,7 +1,6 @@ use crate::propose::*; use cw_orch::prelude::*; - // pre-proposal suite impl cw_orch::contract::Deploy for DaoPreProposeSuite { // We don't have a custom error type @@ -56,11 +55,16 @@ impl cw_orch::contract::Deploy for DaoProposalSuite } fn get_contracts_mut(&mut self) -> Vec>> { - vec![ + let mut boxs = vec![]; + let prop: Vec>> = vec![ Box::new(&mut self.prop_single), Box::new(&mut self.prop_multiple), Box::new(&mut self.prop_condocert), - ] + ]; + + boxs.extend(prop); + boxs.extend(self.pre_prop_suite.get_contracts_mut()); + boxs } fn load_from(chain: Chain) -> Result { diff --git a/scripts/src/tests/external/admin_factory.rs b/scripts/src/tests/external/admin_factory.rs index beeb4a668..e69de29bb 100644 --- a/scripts/src/tests/external/admin_factory.rs +++ b/scripts/src/tests/external/admin_factory.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - external::AdminFactorySuite, - tests::{ADMIN, PREFIX}, -}; - -#[test] -fn test_admin() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/btsg_ft_factory.rs b/scripts/src/tests/external/btsg_ft_factory.rs index beeb4a668..e69de29bb 100644 --- a/scripts/src/tests/external/btsg_ft_factory.rs +++ b/scripts/src/tests/external/btsg_ft_factory.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - external::AdminFactorySuite, - tests::{ADMIN, PREFIX}, -}; - -#[test] -fn test_admin() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = AdminFactorySuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/cw721_roles.rs b/scripts/src/tests/external/cw721_roles.rs index c38a32aa6..e69de29bb 100644 --- a/scripts/src/tests/external/cw721_roles.rs +++ b/scripts/src/tests/external/cw721_roles.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - tests::{ADMIN, PREFIX}, - Cw721RolesSuite, -}; - -#[test] -fn test_cw721_roles() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = Cw721RolesSuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/dao_migration.rs b/scripts/src/tests/external/dao_migration.rs index ed333c6a0..e69de29bb 100644 --- a/scripts/src/tests/external/dao_migration.rs +++ b/scripts/src/tests/external/dao_migration.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - tests::{ADMIN, PREFIX}, - DaoMigrationSuite, -}; - -#[test] -fn test_dao_migration() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = DaoMigrationSuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/mod.rs b/scripts/src/tests/external/mod.rs index 0a7c11872..3b267d7e2 100644 --- a/scripts/src/tests/external/mod.rs +++ b/scripts/src/tests/external/mod.rs @@ -1,3 +1,7 @@ +use cw_orch::{anyhow, prelude::*}; +use crate::DaoExternalSuite; +use super::{ADMIN, PREFIX}; + pub mod admin_factory; pub mod btsg_ft_factory; pub mod cw721_roles; @@ -6,3 +10,12 @@ pub mod payroll; pub mod token_swap; pub mod tokenfactory_issuer; pub mod vesting; + +#[test] +fn test_external_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _app = DaoExternalSuite::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} diff --git a/scripts/src/tests/external/payroll.rs b/scripts/src/tests/external/payroll.rs index 6fb284970..e69de29bb 100644 --- a/scripts/src/tests/external/payroll.rs +++ b/scripts/src/tests/external/payroll.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - external::PayrollSuite, - tests::{ADMIN, PREFIX}, -}; - -#[test] -fn test_payroll() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = PayrollSuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/token_swap.rs b/scripts/src/tests/external/token_swap.rs index 25a6b4dc2..1f5a44ba0 100644 --- a/scripts/src/tests/external/token_swap.rs +++ b/scripts/src/tests/external/token_swap.rs @@ -1,43 +1,25 @@ use cw_orch::{anyhow, prelude::*}; use cw_token_swap::msg::{Counterparty, InstantiateMsg, TokenInfo}; +use dao_cw_orch::DaoExternalTokenSwap; -use crate::{ - external::TokenSwapSuite, - tests::{ADMIN, DAO1, DENOM, PREFIX}, -}; -#[test] -fn test_tokenswap() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let app = TokenSwapSuite::deploy_on(mock.clone(), admin.clone())?; - setup_tokenswap_helper( - app, - mock.sender.to_string(), - mock.addr_make(DAO1).to_string(), - )?; - - mock.next_block().unwrap(); - Ok(()) -} - -fn setup_tokenswap_helper( - app: TokenSwapSuite, +fn _setup_tokenswap_helper( + app: DaoExternalTokenSwap, sender: String, counterparty: String, ) -> anyhow::Result<()> { - app.tokenswap.instantiate( + app.instantiate( &InstantiateMsg { counterparty_one: Counterparty { address: sender, promise: TokenInfo::Native { - denom: DENOM.to_string(), + denom: "juno".to_string(), amount: 1_000u128.into(), }, }, counterparty_two: Counterparty { address: counterparty, promise: TokenInfo::Native { - denom: DENOM.to_string(), + denom: "juno".to_string(), amount: 1_000u128.into(), }, }, diff --git a/scripts/src/tests/external/tokenfactory_issuer.rs b/scripts/src/tests/external/tokenfactory_issuer.rs index 46a3b9fd6..e69de29bb 100644 --- a/scripts/src/tests/external/tokenfactory_issuer.rs +++ b/scripts/src/tests/external/tokenfactory_issuer.rs @@ -1,16 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - external::TokenFactorySuite, - tests::{ADMIN, PREFIX}, -}; - -#[test] -fn test_tokenfactory() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = TokenFactorySuite::deploy_on(mock.clone(), admin.clone())?; - - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/external/vesting.rs b/scripts/src/tests/external/vesting.rs index 0bebbfaf7..e69de29bb 100644 --- a/scripts/src/tests/external/vesting.rs +++ b/scripts/src/tests/external/vesting.rs @@ -1,15 +0,0 @@ -use cw_orch::{anyhow, prelude::*}; - -use crate::{ - tests::{ADMIN, PREFIX}, - VestingSuite, -}; - -#[test] -fn test_vesting() -> anyhow::Result<()> { - let mock = MockBech32::new(PREFIX); - let admin = mock.addr_make(ADMIN); - let _app = VestingSuite::deploy_on(mock.clone(), admin.clone())?; - mock.next_block().unwrap(); - Ok(()) -} diff --git a/scripts/src/tests/mod.rs b/scripts/src/tests/mod.rs index 99a8bafb9..3af2e8f06 100644 --- a/scripts/src/tests/mod.rs +++ b/scripts/src/tests/mod.rs @@ -1,11 +1,26 @@ +use cw_orch::{anyhow, prelude::*}; + +use crate::DaoDao; + mod deploy; -mod external; -mod voting; -mod staking; mod distribution; +mod external; mod propose; +mod staking; +mod voting; pub(crate) const PREFIX: &str = "mock"; pub(crate) const ADMIN: &str = "admin"; -pub(crate) const DENOM: &str = "juno"; -pub(crate) const DAO1: &str = "dao1"; +// pub(crate) const DENOM: &str = "juno"; +// pub(crate) const DAO1: &str = "dao1"; + + + +#[test] +fn test_dao_suite() -> anyhow::Result<()> { + let mock = MockBech32::new(PREFIX); + let admin = mock.addr_make(ADMIN); + let _app = DaoDao::deploy_on(mock.clone(), admin.clone())?; + mock.next_block().unwrap(); + Ok(()) +} From 6660b23df886593c70f20b396495b7c91182bafa Mon Sep 17 00:00:00 2001 From: Jake Hartnell Date: Wed, 14 Aug 2024 17:52:42 -0400 Subject: [PATCH 43/50] Attempt to free up disk space --- .github/workflows/test_tube.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test_tube.yml b/.github/workflows/test_tube.yml index 3b1a584cb..c83b770a9 100644 --- a/.github/workflows/test_tube.yml +++ b/.github/workflows/test_tube.yml @@ -17,6 +17,10 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + # https://github.com/orgs/community/discussions/25678 + - name: Free up disk space on runner + run: df -h && rm -rf /usr/share/dotnet/ && df -h + - name: Install latest nightly toolchain uses: actions-rs/toolchain@v1 with: From a9efb44abb104778790cf16f012ec2710a59ff46 Mon Sep 17 00:00:00 2001 From: Jake Hartnell Date: Wed, 14 Aug 2024 17:57:36 -0400 Subject: [PATCH 44/50] Attempt to free up more disk space --- .github/workflows/test_tube.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_tube.yml b/.github/workflows/test_tube.yml index c83b770a9..b0379ff42 100644 --- a/.github/workflows/test_tube.yml +++ b/.github/workflows/test_tube.yml @@ -19,7 +19,16 @@ jobs: # https://github.com/orgs/community/discussions/25678 - name: Free up disk space on runner - run: df -h && rm -rf /usr/share/dotnet/ && df -h + run: | + df -h + rm -rf /usr/share/dotnet/ + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^dotnet-.*' + sudo apt-get remove -y azure-cli google-cloud-sdk hhvm google-chrome-stable powershell mono-devel + sudo apt-get autoremove -y + sudo apt-get clean + df -h + shell: bash - name: Install latest nightly toolchain uses: actions-rs/toolchain@v1 From 685211d934c510f55cdc1a531a0802ef0016fc4a Mon Sep 17 00:00:00 2001 From: Jake Hartnell Date: Wed, 14 Aug 2024 17:59:24 -0400 Subject: [PATCH 45/50] Fix removing uninstalled packages --- .github/workflows/test_tube.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_tube.yml b/.github/workflows/test_tube.yml index b0379ff42..909a8c839 100644 --- a/.github/workflows/test_tube.yml +++ b/.github/workflows/test_tube.yml @@ -24,7 +24,7 @@ jobs: rm -rf /usr/share/dotnet/ sudo apt-get remove -y 'php.*' sudo apt-get remove -y '^dotnet-.*' - sudo apt-get remove -y azure-cli google-cloud-sdk hhvm google-chrome-stable powershell mono-devel + sudo apt-get remove -y azure-cli firefox powershell mono-devel sudo apt-get autoremove -y sudo apt-get clean df -h From bc42b275e4fc655c71b70dfef2906685184127ac Mon Sep 17 00:00:00 2001 From: noah Date: Thu, 26 Sep 2024 17:50:41 -0400 Subject: [PATCH 46/50] fixed cw20 fund bug in reward distributor that requires open funding to be enabled (#886) --- .../distribution/dao-rewards-distributor/src/contract.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/distribution/dao-rewards-distributor/src/contract.rs b/contracts/distribution/dao-rewards-distributor/src/contract.rs index 5ef9217e4..c9d295518 100644 --- a/contracts/distribution/dao-rewards-distributor/src/contract.rs +++ b/contracts/distribution/dao-rewards-distributor/src/contract.rs @@ -122,7 +122,9 @@ fn execute_receive_cw20( } }; - execute_fund(deps, env, info.sender, distribution, wrapper.amount) + let sender = deps.api.addr_validate(&wrapper.sender)?; + + execute_fund(deps, env, sender, distribution, wrapper.amount) } ReceiveCw20Msg::FundLatest {} => { let id = COUNT.load(deps.storage)?; @@ -141,7 +143,9 @@ fn execute_receive_cw20( } }; - execute_fund(deps, env, info.sender, distribution, wrapper.amount) + let sender = deps.api.addr_validate(&wrapper.sender)?; + + execute_fund(deps, env, sender, distribution, wrapper.amount) } } } From b0c7ef162d80667ddb99a1896e708134681d1d4d Mon Sep 17 00:00:00 2001 From: Gabe Lopez Date: Mon, 7 Oct 2024 13:48:42 -0500 Subject: [PATCH 47/50] Free up more space for github actions (#885) --- .github/workflows/basic.yml | 11 +++++++++++ .github/workflows/integration_tests.yml | 11 +++++++++++ .github/workflows/test_tube.yml | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 56580ba10..362bac157 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -12,6 +12,17 @@ jobs: - name: Checkout sources uses: actions/checkout@v2 + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: true + - name: Install latest stable toolchain uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 42af0ab81..1b1313e1d 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -17,6 +17,17 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: true + - name: Install latest nightly toolchain uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/test_tube.yml b/.github/workflows/test_tube.yml index 3b1a584cb..001908f12 100644 --- a/.github/workflows/test_tube.yml +++ b/.github/workflows/test_tube.yml @@ -17,6 +17,17 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: true + - name: Install latest nightly toolchain uses: actions-rs/toolchain@v1 with: From c05a6c8ac359249d12fb71a14a53284274b62360 Mon Sep 17 00:00:00 2001 From: noah Date: Thu, 17 Oct 2024 10:13:12 -0400 Subject: [PATCH 48/50] organize tests (#890) * moved all contract wrappers to dao-testing * updated schema * added DAO creation testing suite scaffold * made DAO testing suites for all voting modules * rewrote dao-rewards-distributor tests using dao-testing suite * fixed integration tests --- Cargo.lock | 52 +- Cargo.toml | 10 +- contracts/dao-dao-core/Cargo.toml | 2 + .../dao-dao-core/schema/dao-dao-core.json | 103 ++ contracts/dao-dao-core/src/tests.rs | 150 +- .../cw-fund-distributor/Cargo.toml | 2 + .../src/testing/adversarial_tests.rs | 56 +- .../cw-fund-distributor/src/testing/tests.rs | 120 +- .../dao-rewards-distributor/Cargo.toml | 1 + .../src/testing/mod.rs | 297 ---- .../src/testing/suite.rs | 397 +++-- .../src/testing/tests.rs | 1511 ++++++++-------- .../btsg-ft-factory/src/testing/mod.rs | 19 +- .../btsg-ft-factory/src/testing/tests.rs | 18 +- .../external/cw-admin-factory/Cargo.toml | 5 +- .../external/cw-admin-factory/src/tests.rs | 52 +- .../external/cw-payroll-factory/Cargo.toml | 4 +- .../external/cw-payroll-factory/src/tests.rs | 51 +- contracts/external/cw-token-swap/Cargo.toml | 2 + contracts/external/cw-token-swap/src/error.rs | 3 +- contracts/external/cw-token-swap/src/tests.rs | 61 +- contracts/external/cw-vesting/Cargo.toml | 1 + contracts/external/cw-vesting/src/tests.rs | 44 +- contracts/external/cw721-roles/src/tests.rs | 4 +- contracts/external/dao-migrator/Cargo.toml | 9 +- .../dao-migrator/src/testing/helpers.rs | 85 +- .../dao-migrator/src/testing/setup.rs | 10 +- .../src/testing/test_migration.rs | 2 +- .../src/tests.rs | 120 +- .../dao-pre-propose-approver/src/tests.rs | 52 +- .../dao-pre-propose-multiple/src/tests.rs | 115 +- .../dao-pre-propose-single/src/tests.rs | 116 +- .../src/testing/suite.rs | 7 +- .../proposal/dao-proposal-multiple/Cargo.toml | 1 + .../src/testing/adversarial_tests.rs | 2 +- .../src/testing/do_votes.rs | 6 +- .../src/testing/instantiate.rs | 62 +- .../src/testing/tests.rs | 100 +- .../proposal/dao-proposal-single/Cargo.toml | 1 + .../src/testing/adversarial_tests.rs | 3 +- .../src/testing/contracts.rs | 108 -- .../src/testing/execute.rs | 7 +- .../src/testing/instantiate.rs | 48 +- .../src/testing/migration_tests.rs | 15 +- .../dao-proposal-single/src/testing/mod.rs | 1 - .../src/testing/queries.rs | 12 +- .../dao-proposal-single/src/testing/tests.rs | 25 +- .../cw20-stake-external-rewards/Cargo.toml | 6 +- .../src/contract.rs | 1580 ----------------- .../cw20-stake-external-rewards/src/lib.rs | 3 + .../cw20-stake-external-rewards/src/tests.rs | 1537 ++++++++++++++++ .../cw20-stake-reward-distributor/Cargo.toml | 10 +- .../src/tests.rs | 68 +- contracts/staking/cw20-stake/Cargo.toml | 2 + contracts/staking/cw20-stake/src/tests.rs | 44 +- .../test/dao-proposal-hook-counter/Cargo.toml | 1 + .../dao-proposal-hook-counter/src/tests.rs | 67 +- .../test/dao-voting-cw20-balance/Cargo.toml | 3 +- .../test/dao-voting-cw20-balance/src/tests.rs | 44 +- .../voting/dao-voting-cw20-staked/Cargo.toml | 1 + .../dao-voting-cw20-staked/src/tests.rs | 138 +- contracts/voting/dao-voting-cw4/Cargo.toml | 2 + contracts/voting/dao-voting-cw4/src/tests.rs | 47 +- .../src/testing/mod.rs | 4 +- .../src/testing/tests.rs | 50 +- .../dao-voting-onft-staked/src/testing/mod.rs | 4 +- .../src/tests/multitest/tests.rs | 97 +- packages/cw-denom/Cargo.toml | 1 + packages/cw-denom/src/integration_tests.rs | 16 +- packages/dao-testing/Cargo.toml | 44 +- packages/dao-testing/src/contracts.rs | 218 --- packages/dao-testing/src/contracts/latest.rs | 336 ++++ packages/dao-testing/src/contracts/mod.rs | 6 + packages/dao-testing/src/contracts/v1.rs | 73 + packages/dao-testing/src/contracts/v241.rs | 73 + packages/dao-testing/src/helpers.rs | 19 +- packages/dao-testing/src/lib.rs | 10 +- packages/dao-testing/src/suite/base.rs | 353 ++++ packages/dao-testing/src/suite/cw20_suite.rs | 269 +++ packages/dao-testing/src/suite/cw4_suite.rs | 148 ++ packages/dao-testing/src/suite/cw721_suite.rs | 246 +++ packages/dao-testing/src/suite/mod.rs | 23 + packages/dao-testing/src/suite/token_suite.rs | 228 +++ scripts/publish.sh | 2 +- 84 files changed, 5111 insertions(+), 4534 deletions(-) delete mode 100644 contracts/proposal/dao-proposal-single/src/testing/contracts.rs create mode 100644 contracts/staking/cw20-stake-external-rewards/src/tests.rs delete mode 100644 packages/dao-testing/src/contracts.rs create mode 100644 packages/dao-testing/src/contracts/latest.rs create mode 100644 packages/dao-testing/src/contracts/mod.rs create mode 100644 packages/dao-testing/src/contracts/v1.rs create mode 100644 packages/dao-testing/src/contracts/v241.rs create mode 100644 packages/dao-testing/src/suite/base.rs create mode 100644 packages/dao-testing/src/suite/cw20_suite.rs create mode 100644 packages/dao-testing/src/suite/cw4_suite.rs create mode 100644 packages/dao-testing/src/suite/cw721_suite.rs create mode 100644 packages/dao-testing/src/suite/mod.rs create mode 100644 packages/dao-testing/src/suite/token_suite.rs diff --git a/Cargo.lock b/Cargo.lock index b1e7d67d1..8a4bde71e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -698,7 +698,6 @@ dependencies = [ "cw2 1.1.2", "cw20-base 1.1.2", "cw4 1.1.2", - "dao-dao-core 2.5.0", "dao-interface 2.5.0", "dao-proposal-single 2.5.0", "dao-testing", @@ -839,6 +838,7 @@ dependencies = [ "cw-multi-test", "cw20 1.1.2", "cw20-base 1.1.2", + "dao-testing", "thiserror", ] @@ -848,6 +848,7 @@ version = "2.5.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", + "cw-fund-distributor", "cw-multi-test", "cw-paginate-storage 2.5.0", "cw-storage-plus 1.2.0", @@ -858,6 +859,7 @@ dependencies = [ "cw20-stake 2.5.0", "dao-dao-core 2.5.0", "dao-interface 2.5.0", + "dao-testing", "dao-voting-cw20-staked", "thiserror", ] @@ -972,12 +974,14 @@ dependencies = [ "cw-denom 2.5.0", "cw-multi-test", "cw-ownable", + "cw-payroll-factory", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw-vesting", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", + "dao-testing", "thiserror", "wynd-utils", ] @@ -1068,10 +1072,12 @@ dependencies = [ "cosmwasm-std", "cw-multi-test", "cw-storage-plus 1.2.0", + "cw-token-swap", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", + "dao-testing", "thiserror", ] @@ -1181,6 +1187,7 @@ dependencies = [ "cw-stake-tracker", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", + "cw-vesting", "cw-wormhole", "cw2 1.1.2", "cw20 1.1.2", @@ -1377,7 +1384,9 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 0.2.6", + "cw20-stake 2.5.0", "dao-hooks 2.5.0", + "dao-testing", "dao-voting 2.5.0", "thiserror", ] @@ -1399,7 +1408,9 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 2.5.0", + "cw20-stake-external-rewards", "dao-hooks 2.5.0", + "dao-testing", "stake-cw20-external-rewards", "thiserror", ] @@ -1418,6 +1429,8 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 2.5.0", + "cw20-stake-reward-distributor", + "dao-testing", "stake-cw20-reward-distributor", "thiserror", ] @@ -1687,9 +1700,11 @@ dependencies = [ "cw20-base 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", + "dao-dao-core 2.5.0", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", "dao-proposal-sudo", + "dao-testing", "dao-voting-cw20-balance", "thiserror", ] @@ -1799,6 +1814,7 @@ dependencies = [ "cw4-voting", "dao-dao-core 2.5.0", "dao-interface 2.5.0", + "dao-migrator", "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 0.1.0", @@ -2054,6 +2070,7 @@ dependencies = [ "dao-hooks 2.5.0", "dao-interface 2.5.0", "dao-proposal-single 2.5.0", + "dao-testing", "dao-voting 2.5.0", "dao-voting-cw20-balance", "thiserror", @@ -2106,6 +2123,7 @@ dependencies = [ "dao-interface 2.5.0", "dao-pre-propose-base 2.5.0", "dao-pre-propose-multiple 2.5.0", + "dao-proposal-multiple 2.5.0", "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", @@ -2170,6 +2188,7 @@ dependencies = [ "dao-interface 2.5.0", "dao-pre-propose-base 2.5.0", "dao-pre-propose-single 2.5.0", + "dao-proposal-single 2.5.0", "dao-testing", "dao-voting 0.1.0", "dao-voting 2.5.0", @@ -2216,6 +2235,7 @@ dependencies = [ "cw721-base 0.18.0", "dao-hooks 2.5.0", "dao-interface 2.5.0", + "dao-rewards-distributor", "dao-testing", "dao-voting 2.5.0", "dao-voting-cw20-staked", @@ -2250,35 +2270,59 @@ dependencies = [ name = "dao-testing" version = "2.5.0" dependencies = [ + "btsg-ft-factory", "cosmwasm-schema", "cosmwasm-std", "cw-admin-factory", "cw-core", + "cw-fund-distributor", "cw-hooks 2.5.0", "cw-multi-test", + "cw-payroll-factory", "cw-proposal-single", + "cw-token-swap", "cw-tokenfactory-issuer", "cw-utils 1.0.3", "cw-vesting", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", + "cw20-stake 0.2.6", "cw20-stake 2.5.0", + "cw20-stake-external-rewards", + "cw20-stake-reward-distributor", "cw4 1.1.2", "cw4-group 1.1.2", + "cw4-voting", "cw721-base 0.18.0", "cw721-roles", + "dao-dao-core 2.4.1", "dao-dao-core 2.5.0", + "dao-interface 2.4.1", "dao-interface 2.5.0", + "dao-migrator", + "dao-pre-propose-approval-single 2.4.1", + "dao-pre-propose-approval-single 2.5.0", + "dao-pre-propose-approver", + "dao-pre-propose-multiple 2.4.1", "dao-pre-propose-multiple 2.5.0", + "dao-pre-propose-single 2.4.1", "dao-pre-propose-single 2.5.0", "dao-proposal-condorcet", + "dao-proposal-hook-counter", + "dao-proposal-multiple 2.4.1", + "dao-proposal-multiple 2.5.0", + "dao-proposal-single 2.4.1", "dao-proposal-single 2.5.0", + "dao-proposal-sudo", + "dao-rewards-distributor", "dao-test-custom-factory", "dao-voting 0.1.0", + "dao-voting 2.4.1", "dao-voting 2.5.0", "dao-voting-cw20-balance", "dao-voting-cw20-staked", + "dao-voting-cw4 2.4.1", "dao-voting-cw4 2.5.0", "dao-voting-cw721-roles", "dao-voting-cw721-staked", @@ -2290,6 +2334,8 @@ dependencies = [ "serde", "serde_json", "stake-cw20", + "stake-cw20-external-rewards", + "stake-cw20-reward-distributor", ] [[package]] @@ -2350,6 +2396,7 @@ dependencies = [ "cw20-base 1.1.2", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", + "dao-testing", "thiserror", ] @@ -2368,6 +2415,7 @@ dependencies = [ "cw20-stake 2.5.0", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", + "dao-testing", "dao-voting 2.5.0", "thiserror", ] @@ -2404,6 +2452,8 @@ dependencies = [ "cw4-group 1.1.2", "dao-dao-macros 2.5.0", "dao-interface 2.5.0", + "dao-testing", + "dao-voting-cw4 2.5.0", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 1d98d3a94..ab164d07e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,6 +85,7 @@ wynd-utils = "0.4" # optional owner. cw-ownable = "0.5" +btsg-ft-factory = { path = "./contracts/external/btsg-ft-factory", version = "2.5.0" } cw-admin-factory = { path = "./contracts/external/cw-admin-factory", version = "2.5.0" } cw-denom = { path = "./packages/cw-denom", version = "2.5.0" } cw-fund-distributor = { path = "./contracts/distribution/cw-fund-distributor", version = "2.5.0" } @@ -92,11 +93,14 @@ cw-hooks = { path = "./packages/cw-hooks", version = "2.5.0" } cw-paginate-storage = { path = "./packages/cw-paginate-storage", version = "2.5.0" } cw-payroll-factory = { path = "./contracts/external/cw-payroll-factory", version = "2.5.0" } cw-stake-tracker = { path = "./packages/cw-stake-tracker", version = "2.5.0" } +cw-token-swap = { path = "./contracts/external/cw-token-swap", version = "2.5.0" } cw-tokenfactory-issuer = { path = "./contracts/external/cw-tokenfactory-issuer", version = "2.5.0", default-features = false } cw-tokenfactory-types = { path = "./packages/cw-tokenfactory-types", version = "2.5.0", default-features = false } cw-vesting = { path = "./contracts/external/cw-vesting", version = "2.5.0" } cw-wormhole = { path = "./packages/cw-wormhole", version = "2.5.0" } cw20-stake = { path = "./contracts/staking/cw20-stake", version = "2.5.0" } +cw20-stake-external-rewards = { path = "./contracts/staking/cw20-stake-external-rewards", version = "2.5.0" } +cw20-stake-reward-distributor = { path = "./contracts/staking/cw20-stake-reward-distributor", version = "2.5.0" } cw721-controllers = { path = "./packages/cw721-controllers", version = "2.5.0" } cw721-roles = { path = "./contracts/external/cw721-roles", version = "2.5.0" } dao-cw721-extensions = { path = "./packages/dao-cw721-extensions", version = "2.5.0" } @@ -104,6 +108,7 @@ dao-dao-core = { path = "./contracts/dao-dao-core", version = "2.5.0" } dao-dao-macros = { path = "./packages/dao-dao-macros", version = "2.5.0" } dao-hooks = { path = "./packages/dao-hooks", version = "2.5.0" } dao-interface = { path = "./packages/dao-interface", version = "2.5.0" } +dao-migrator = { path = "./contracts/external/dao-migrator", version = "2.5.0" } dao-pre-propose-approval-single = { path = "./contracts/pre-propose/dao-pre-propose-approval-single", version = "2.5.0" } dao-pre-propose-approver = { path = "./contracts/pre-propose/dao-pre-propose-approver", version = "2.5.0" } dao-pre-propose-base = { path = "./packages/dao-pre-propose-base", version = "2.5.0" } @@ -134,9 +139,12 @@ cw20-stake-external-rewards-v1 = { package = "stake-cw20-external-rewards", vers cw20-stake-reward-distributor-v1 = { package = "stake-cw20-reward-distributor", version = "0.1.0" } cw20-stake-v1 = { package = "cw20-stake", version = "0.2.6" } cw20-staked-balance-voting-v1 = { package = "cw20-staked-balance-voting", version = "0.1.0" } -cw4-voting-v1 = { package = "cw4-voting", version = "0.1.0" } stake-cw20-v03 = { package = "stake-cw20", version = "0.2.6" } +cw4-voting-v1 = { package = "cw4-voting", version = "0.1.0", git = "https://github.com/DA0-DA0/dao-contracts.git", tag = "v1.0.0" } +cw-core-interface-v1 = { package = "cw-core-interface", version = "0.1.0", git = "https://github.com/DA0-DA0/dao-contracts.git", tag = "v1.0.0" } voting-v1 = { package = "dao-voting", version = "0.1.0" } +cw20-v1 = { version = "0.13", package = "cw20" } +cw4-v1 = { version = "0.13", package = "cw4" } # v2.4.1 dependencies. used for state migrations. cw-denom-v241 = { package = "cw-denom", version = "=2.4.1" } diff --git a/contracts/dao-dao-core/Cargo.toml b/contracts/dao-dao-core/Cargo.toml index a9ac8dae6..fe9b3f2b7 100644 --- a/contracts/dao-dao-core/Cargo.toml +++ b/contracts/dao-dao-core/Cargo.toml @@ -31,8 +31,10 @@ cw-paginate-storage = { workspace = true } cw-core-v1 = { workspace = true, features = ["library"] } [dev-dependencies] +dao-dao-core = { workspace = true } cw-multi-test = { workspace = true } cw20-base = { workspace = true } cw721-base = { workspace = true } dao-proposal-sudo = { workspace = true } +dao-testing = { workspace = true } dao-voting-cw20-balance = { workspace = true } diff --git a/contracts/dao-dao-core/schema/dao-dao-core.json b/contracts/dao-dao-core/schema/dao-dao-core.json index b1cca4f3d..7bf2418c2 100644 --- a/contracts/dao-dao-core/schema/dao-dao-core.json +++ b/contracts/dao-dao-core/schema/dao-dao-core.json @@ -918,6 +918,10 @@ }, "additionalProperties": false }, + "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" + }, "DistributionMsg": { "description": "The message types of the distribution module.\n\nSee https://github.com/cosmos/cosmos-sdk/blob/v0.42.4/proto/cosmos/distribution/v1beta1/tx.proto", "oneOf": [ @@ -1039,6 +1043,36 @@ } }, "additionalProperties": false + }, + { + "description": "This maps directly to [MsgVoteWeighted](https://github.com/cosmos/cosmos-sdk/blob/v0.45.8/proto/cosmos/gov/v1beta1/tx.proto#L66-L78) in the Cosmos SDK with voter set to the contract address.", + "type": "object", + "required": [ + "vote_weighted" + ], + "properties": { + "vote_weighted": { + "type": "object", + "required": [ + "options", + "proposal_id" + ], + "properties": { + "options": { + "type": "array", + "items": { + "$ref": "#/definitions/WeightedVoteOption" + } + }, + "proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false } ] }, @@ -1463,6 +1497,60 @@ }, "additionalProperties": false }, + { + "description": "Instantiates a new contracts from previously uploaded Wasm code using a predictable address derivation algorithm implemented in [`cosmwasm_std::instantiate2_address`].\n\nThis is translated to a [MsgInstantiateContract2](https://github.com/CosmWasm/wasmd/blob/v0.29.2/proto/cosmwasm/wasm/v1/tx.proto#L73-L96). `sender` is automatically filled with the current contract's address. `fix_msg` is automatically set to false.", + "type": "object", + "required": [ + "instantiate2" + ], + "properties": { + "instantiate2": { + "type": "object", + "required": [ + "code_id", + "funds", + "label", + "msg", + "salt" + ], + "properties": { + "admin": { + "type": [ + "string", + "null" + ] + }, + "code_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "funds": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "label": { + "description": "A human-readable label for the contract.\n\nValid values should: - not be empty - not be bigger than 128 bytes (or some chain-specific limit) - not start / end with whitespace", + "type": "string" + }, + "msg": { + "description": "msg is the JSON-encoded InstantiateMsg struct (as raw Binary)", + "allOf": [ + { + "$ref": "#/definitions/Binary" + } + ] + }, + "salt": { + "$ref": "#/definitions/Binary" + } + } + } + }, + "additionalProperties": false + }, { "description": "Migrates a given contracts to use new wasm code. Passes a MigrateMsg to allow us to customize behavior.\n\nOnly the contract admin (as defined in wasmd), if any, is able to make this call.\n\nThis is translated to a [MsgMigrateContract](https://github.com/CosmWasm/wasmd/blob/v0.14.0/x/wasm/internal/types/tx.proto#L86-L96). `sender` is automatically filled with the current contract's address.", "type": "object", @@ -1547,6 +1635,21 @@ "additionalProperties": false } ] + }, + "WeightedVoteOption": { + "type": "object", + "required": [ + "option", + "weight" + ], + "properties": { + "option": { + "$ref": "#/definitions/VoteOption" + }, + "weight": { + "$ref": "#/definitions/Decimal" + } + } } } }, diff --git a/contracts/dao-dao-core/src/tests.rs b/contracts/dao-dao-core/src/tests.rs index 81dd040cb..4c04f8cc3 100644 --- a/contracts/dao-dao-core/src/tests.rs +++ b/contracts/dao-dao-core/src/tests.rs @@ -5,7 +5,7 @@ use cosmwasm_std::{ to_json_binary, Addr, CosmosMsg, Empty, Storage, Uint128, WasmMsg, }; use cw2::{set_contract_version, ContractVersion}; -use cw_multi_test::{App, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, Executor}; use cw_storage_plus::{Item, Map}; use cw_utils::{Duration, Expiration}; use dao_interface::{ @@ -17,71 +17,19 @@ use dao_interface::{ state::{Admin, Config, ModuleInstantiateInfo, ProposalModule, ProposalModuleStatus}, voting::{InfoResponse, VotingPowerAtHeightResponse}, }; +use dao_testing::contracts::{ + cw20_base_contract, cw721_base_contract, dao_dao_core_contract, dao_proposal_sudo_contract, + dao_voting_cw20_balance_contract, v1::cw_core_v1_contract, +}; use crate::{ contract::{derive_proposal_module_prefix, migrate, CONTRACT_NAME, CONTRACT_VERSION}, state::PROPOSAL_MODULES, - ContractError, }; +use dao_dao_core::ContractError; const CREATOR_ADDR: &str = "creator"; -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn cw721_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_base::entry::execute, - cw721_base::entry::instantiate, - cw721_base::entry::query, - ); - Box::new(contract) -} - -fn sudo_proposal_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_sudo::contract::execute, - dao_proposal_sudo::contract::instantiate, - dao_proposal_sudo::contract::query, - ); - Box::new(contract) -} - -fn cw20_balances_voting() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_balance::contract::execute, - dao_voting_cw20_balance::contract::instantiate, - dao_voting_cw20_balance::contract::query, - ) - .with_reply(dao_voting_cw20_balance::contract::reply); - Box::new(contract) -} - -fn cw_core_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn v1_cw_core_contract() -> Box> { - use cw_core_v1::contract; - let contract = ContractWrapper::new(contract::execute, contract::instantiate, contract::query) - .with_reply(contract::reply) - .with_migrate(contract::migrate); - Box::new(contract) -} - fn instantiate_gov(app: &mut App, code_id: u64, msg: InstantiateMsg) -> Addr { app.instantiate_contract( code_id, @@ -96,8 +44,8 @@ fn instantiate_gov(app: &mut App, code_id: u64, msg: InstantiateMsg) -> Addr { fn test_instantiate_with_n_gov_modules(n: usize) { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), @@ -176,8 +124,8 @@ fn test_valid_instantiate() { #[should_panic(expected = "Error parsing into type cw20_base::msg::InstantiateMsg: Invalid type")] fn test_instantiate_with_submessage_failure() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let gov_id = app.store_code(cw_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), @@ -239,8 +187,8 @@ makes wickedness." #[test] fn test_update_config() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -338,8 +286,8 @@ fn test_update_config() { fn test_swap_governance(swaps: Vec<(u32, u32)>) { let mut app = App::default(); - let propmod_id = app.store_code(sudo_proposal_contract()); - let core_id = app.store_code(cw_core_contract()); + let propmod_id = app.store_code(dao_proposal_sudo_contract()); + let core_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -517,8 +465,8 @@ fn test_swap_governance_bad() { #[test] fn test_removed_modules_can_not_execute() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -680,8 +628,8 @@ fn test_removed_modules_can_not_execute() { #[test] fn test_module_already_disabled() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -782,8 +730,8 @@ fn test_module_already_disabled() { #[test] fn test_swap_voting_module() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -888,8 +836,8 @@ fn test_unauthorized(app: &mut App, gov_addr: Addr, msg: ExecuteMsg) { #[test] fn test_permissions() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -972,10 +920,10 @@ fn test_permissions() { fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -1689,10 +1637,10 @@ fn test_remove_missing_key() { #[test] fn test_list_items() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -1808,10 +1756,10 @@ fn test_list_items() { #[test] fn test_instantiate_with_items() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -1927,7 +1875,7 @@ fn test_instantiate_with_items() { fn test_cw20_receive_auto_add() { let (gov_addr, mut app) = do_standard_instantiate(true, None); - let cw20_id = app.store_code(cw20_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let another_cw20 = app .instantiate_contract( cw20_id, @@ -2074,7 +2022,7 @@ fn test_cw20_receive_auto_add() { fn test_cw20_receive_no_auto_add() { let (gov_addr, mut app) = do_standard_instantiate(false, None); - let cw20_id = app.store_code(cw20_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let another_cw20 = app .instantiate_contract( cw20_id, @@ -2159,7 +2107,7 @@ fn test_cw20_receive_no_auto_add() { fn test_cw721_receive() { let (gov_addr, mut app) = do_standard_instantiate(true, None); - let cw721_id = app.store_code(cw721_contract()); + let cw721_id = app.store_code(cw721_base_contract()); let cw721_addr = app .instantiate_contract( @@ -2289,7 +2237,7 @@ fn test_cw721_receive() { fn test_cw721_receive_no_auto_add() { let (gov_addr, mut app) = do_standard_instantiate(false, None); - let cw721_id = app.store_code(cw721_contract()); + let cw721_id = app.store_code(cw721_base_contract()); let cw721_addr = app .instantiate_contract( @@ -2651,10 +2599,10 @@ fn test_dump_state_proposal_modules() { #[test] fn test_migrate_from_compatible() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let gov_id = app.store_code(cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -2739,11 +2687,11 @@ fn test_migrate_from_beta() { use cw_core_v1 as v1; let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let voting_id = app.store_code(cw20_balances_voting()); - let core_id = app.store_code(cw_core_contract()); - let v1_core_id = app.store_code(v1_cw_core_contract()); - let cw20_id = app.store_code(cw20_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let v1_core_id = app.store_code(cw_core_v1_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let proposal_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), @@ -2953,8 +2901,8 @@ fn test_execute_stargate_msg() { #[test] fn test_module_prefixes() { let mut app = App::default(); - let govmod_id = app.store_code(sudo_proposal_contract()); - let gov_id = app.store_code(cw_core_contract()); + let govmod_id = app.store_code(dao_proposal_sudo_contract()); + let gov_id = app.store_code(dao_dao_core_contract()); let govmod_instantiate = dao_proposal_sudo::msg::InstantiateMsg { root: CREATOR_ADDR.to_string(), diff --git a/contracts/distribution/cw-fund-distributor/Cargo.toml b/contracts/distribution/cw-fund-distributor/Cargo.toml index f73aba4df..6d67b634d 100644 --- a/contracts/distribution/cw-fund-distributor/Cargo.toml +++ b/contracts/distribution/cw-fund-distributor/Cargo.toml @@ -30,6 +30,8 @@ dao-interface = { workspace = true } cw-paginate-storage = { workspace = true } [dev-dependencies] +cw-fund-distributor = { workspace = true } dao-dao-core = { workspace = true, features = ["library"] } +dao-testing = { workspace = true } cw-multi-test = { workspace = true } cw20-base = { workspace = true, features = ["library"] } diff --git a/contracts/distribution/cw-fund-distributor/src/testing/adversarial_tests.rs b/contracts/distribution/cw-fund-distributor/src/testing/adversarial_tests.rs index 8df033529..cc0e0c865 100644 --- a/contracts/distribution/cw-fund-distributor/src/testing/adversarial_tests.rs +++ b/contracts/distribution/cw-fund-distributor/src/testing/adversarial_tests.rs @@ -1,9 +1,13 @@ use crate::msg::ExecuteMsg::ClaimAll; use crate::msg::{ExecuteMsg, InstantiateMsg}; -use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Empty, Uint128}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Uint128}; use cw20::{BalanceResponse, Cw20Coin}; -use cw_multi_test::{next_block, App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; +use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; use cw_utils::Duration; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, cw_fund_distributor_contract, + dao_voting_cw20_staked_contract, +}; const CREATOR_ADDR: &str = "creator"; const FEE_DENOM: &str = "ujuno"; @@ -13,44 +17,6 @@ struct BaseTest { distributor_address: Addr, } -fn distributor_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_staked::contract::execute, - dao_voting_cw20_staked::contract::instantiate, - dao_voting_cw20_staked::contract::query, - ) - .with_reply(dao_voting_cw20_staked::contract::reply); - Box::new(contract) -} - -fn cw20_staking_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - fn instantiate_cw20( app: &mut App, sender: Addr, @@ -58,7 +24,7 @@ fn instantiate_cw20( name: String, symbol: String, ) -> Addr { - let cw20_id = app.store_code(cw20_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let msg = cw20_base::msg::InstantiateMsg { name, symbol, @@ -74,10 +40,10 @@ fn instantiate_cw20( fn setup_test(initial_balances: Vec) -> BaseTest { let mut app = App::default(); - let distributor_id = app.store_code(distributor_contract()); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balances_voting_contract()); - let stake_cw20_id = app.store_code(cw20_staking_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let stake_cw20_id = app.store_code(cw20_stake_contract()); let voting_address = app .instantiate_contract( diff --git a/contracts/distribution/cw-fund-distributor/src/testing/tests.rs b/contracts/distribution/cw-fund-distributor/src/testing/tests.rs index f3269dd3f..d86ca86a0 100644 --- a/contracts/distribution/cw-fund-distributor/src/testing/tests.rs +++ b/contracts/distribution/cw-fund-distributor/src/testing/tests.rs @@ -2,10 +2,14 @@ use crate::msg::{ CW20EntitlementResponse, CW20Response, DenomResponse, ExecuteMsg, InstantiateMsg, MigrateMsg, NativeEntitlementResponse, QueryMsg, TotalPowerResponse, VotingContractResponse, }; -use crate::ContractError; -use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Empty, Uint128, WasmMsg}; +use cosmwasm_std::{to_json_binary, Addr, Binary, Coin, Uint128, WasmMsg}; use cw20::Cw20Coin; -use cw_multi_test::{next_block, App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; +use cw_fund_distributor::ContractError; +use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, cw_fund_distributor_contract, + dao_voting_cw20_staked_contract, +}; use crate::msg::ExecuteMsg::{ClaimAll, ClaimCW20, ClaimNatives}; use crate::msg::QueryMsg::TotalPower; @@ -15,44 +19,6 @@ use cw_utils::Duration; const CREATOR_ADDR: &str = "creator"; const FEE_DENOM: &str = "ujuno"; -fn distributor_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_staked::contract::execute, - dao_voting_cw20_staked::contract::instantiate, - dao_voting_cw20_staked::contract::query, - ) - .with_reply(dao_voting_cw20_staked::contract::reply); - Box::new(contract) -} - -fn cw20_staking_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - struct BaseTest { app: App, distributor_address: Addr, @@ -61,10 +27,10 @@ struct BaseTest { fn setup_test(initial_balances: Vec) -> BaseTest { let mut app = App::default(); - let distributor_id = app.store_code(distributor_contract()); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balances_voting_contract()); - let stake_cw20_id = app.store_code(cw20_staking_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let stake_cw20_id = app.store_code(cw20_stake_contract()); let voting_address = app .instantiate_contract( @@ -196,7 +162,7 @@ pub fn mint_natives(app: &mut App, recipient: Addr, amount: Uint128) { .unwrap(); } -pub fn fund_distributor_contract_cw20( +pub fn fund_cw_fund_distributor_contract_cw20( app: &mut App, distributor_address: Addr, token_address: Addr, @@ -216,7 +182,7 @@ pub fn fund_distributor_contract_cw20( .unwrap(); } -pub fn fund_distributor_contract_natives( +pub fn fund_cw_fund_distributor_contract_natives( app: &mut App, distributor_address: Addr, amount: Uint128, @@ -237,7 +203,7 @@ pub fn fund_distributor_contract_natives( #[test] fn test_instantiate_fails_given_invalid_voting_contract_address() { let mut app = App::default(); - let distributor_id = app.store_code(distributor_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); let expected_error: ContractError = app .instantiate_contract( @@ -265,10 +231,10 @@ fn test_instantiate_fails_given_invalid_voting_contract_address() { #[test] fn test_instantiate_fails_zero_voting_power() { let mut app = App::default(); - let distributor_id = app.store_code(distributor_contract()); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balances_voting_contract()); - let stake_cw20_id = app.store_code(cw20_staking_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let stake_cw20_id = app.store_code(cw20_stake_contract()); let initial_balances = vec![Cw20Coin { address: "bekauz".to_string(), @@ -376,7 +342,7 @@ fn test_fund_cw20() { let first_fund_amount = Uint128::new(20000); // fund the contract for the first time - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -391,7 +357,7 @@ fn test_fund_cw20() { let second_fund_amount = amount.checked_sub(first_fund_amount).unwrap(); // fund the remaining part - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -464,7 +430,7 @@ pub fn test_fund_natives() { let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -476,7 +442,7 @@ pub fn test_fund_natives() { // fund again with an existing balance with an existing balance, fund mint_natives(&mut app, Addr::unchecked("bekauz"), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -571,7 +537,7 @@ pub fn test_claim_cw20() { ); // fund the contract - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -641,7 +607,7 @@ pub fn test_claim_cw20_twice() { ); // fund the contract - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -715,7 +681,7 @@ pub fn test_claim_cw20s_empty_list() { ); // fund the contract - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address, @@ -760,7 +726,7 @@ pub fn test_claim_natives_twice() { let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -823,7 +789,7 @@ pub fn test_claim_natives() { let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -876,7 +842,7 @@ pub fn test_claim_all() { let amount = Uint128::new(500000); // mint and fund the distributor with native & cw20 tokens mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -889,7 +855,7 @@ pub fn test_claim_all() { amount, Addr::unchecked(CREATOR_ADDR), ); - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -956,7 +922,7 @@ pub fn test_claim_natives_empty_list_of_denoms() { let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1002,11 +968,11 @@ pub fn test_redistribute_unclaimed_funds() { amount: Uint128::new(20), }, ]); - let distributor_id = app.store_code(distributor_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1103,14 +1069,14 @@ pub fn test_unauthorized_redistribute_unclaimed_funds() { mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, Addr::unchecked(CREATOR_ADDR), ); - let distributor_id = app.store_code(distributor_contract()); + let distributor_id = app.store_code(cw_fund_distributor_contract()); let migrate_msg = &MigrateMsg::RedistributeUnclaimedFunds { distribution_height: app.block_info().height, }; @@ -1149,7 +1115,7 @@ pub fn test_claim_cw20_during_funding_period() { ); // fund the contract - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -1197,7 +1163,7 @@ pub fn test_claim_natives_during_funding_period() { mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); // fund the contract - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1241,7 +1207,7 @@ pub fn test_claim_all_during_funding_period() { let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1377,7 +1343,7 @@ fn test_query_cw20_entitlements() { amount, Addr::unchecked(CREATOR_ADDR), ); - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -1431,7 +1397,7 @@ fn test_query_native_entitlements() { // fund the contract with some native tokens let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1476,7 +1442,7 @@ fn test_query_cw20_entitlement() { amount, Addr::unchecked(CREATOR_ADDR), ); - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address.clone(), @@ -1539,7 +1505,7 @@ fn test_query_native_entitlement() { // fund the contract with some native tokens let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, @@ -1585,7 +1551,7 @@ fn test_query_cw20_tokens() { amount, Addr::unchecked(CREATOR_ADDR), ); - fund_distributor_contract_cw20( + fund_cw_fund_distributor_contract_cw20( &mut app, distributor_address.clone(), token_address, @@ -1628,7 +1594,7 @@ fn test_query_native_denoms() { // mint and fund the distributor with a native token let amount = Uint128::new(500000); mint_natives(&mut app, Addr::unchecked(CREATOR_ADDR), amount); - fund_distributor_contract_natives( + fund_cw_fund_distributor_contract_natives( &mut app, distributor_address.clone(), amount, diff --git a/contracts/distribution/dao-rewards-distributor/Cargo.toml b/contracts/distribution/dao-rewards-distributor/Cargo.toml index 4d38cbc3b..035aba996 100644 --- a/contracts/distribution/dao-rewards-distributor/Cargo.toml +++ b/contracts/distribution/dao-rewards-distributor/Cargo.toml @@ -33,6 +33,7 @@ semver = { workspace = true } thiserror = { workspace = true } [dev-dependencies] +dao-rewards-distributor = { workspace = true } cw-multi-test = { workspace = true } anyhow = { workspace = true } cw20-stake = { workspace = true, features = ["library"] } diff --git a/contracts/distribution/dao-rewards-distributor/src/testing/mod.rs b/contracts/distribution/dao-rewards-distributor/src/testing/mod.rs index e84477456..836069a0a 100644 --- a/contracts/distribution/dao-rewards-distributor/src/testing/mod.rs +++ b/contracts/distribution/dao-rewards-distributor/src/testing/mod.rs @@ -1,299 +1,2 @@ -use cosmwasm_std::Empty; -use cw_multi_test::{Contract, ContractWrapper}; - pub mod suite; pub mod tests; - -pub const DENOM: &str = "ujuno"; -pub const ALT_DENOM: &str = "unotjuno"; -pub const OWNER: &str = "owner"; -pub const ADDR1: &str = "addr1"; -pub const ADDR2: &str = "addr2"; -pub const ADDR3: &str = "addr3"; -pub const ADDR4: &str = "addr4"; - -pub fn contract_rewards() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ); - Box::new(contract) -} - -mod cw4_setup { - use cosmwasm_std::Addr; - use cw4::Member; - use cw_multi_test::{App, Executor}; - use dao_testing::contracts::{cw4_group_contract, dao_voting_cw4_contract}; - - use super::OWNER; - - pub fn setup_cw4_test(app: &mut App, initial_members: Vec) -> (Addr, Addr) { - let cw4_group_code_id = app.store_code(cw4_group_contract()); - let vp_code_id = app.store_code(dao_voting_cw4_contract()); - - let msg = dao_voting_cw4::msg::InstantiateMsg { - group_contract: dao_voting_cw4::msg::GroupContract::New { - cw4_group_code_id, - initial_members, - }, - }; - - let vp_addr = app - .instantiate_contract( - vp_code_id, - Addr::unchecked(OWNER), - &msg, - &[], - "cw4-vp", - None, - ) - .unwrap(); - - let cw4_addr: Addr = app - .wrap() - .query_wasm_smart( - vp_addr.clone(), - &dao_voting_cw4::msg::QueryMsg::GroupContract {}, - ) - .unwrap(); - - (vp_addr, cw4_addr) - } -} - -mod native_setup { - use cosmwasm_std::{coins, Addr}; - use cw_multi_test::{App, Executor}; - use dao_testing::contracts::native_staked_balances_voting_contract; - - use super::{DENOM, OWNER}; - - pub fn stake_tokenfactory_tokens( - app: &mut App, - staking_addr: &Addr, - address: &str, - amount: u128, - ) { - let msg = dao_voting_token_staked::msg::ExecuteMsg::Stake {}; - app.execute_contract( - Addr::unchecked(address), - staking_addr.clone(), - &msg, - &coins(amount, DENOM), - ) - .unwrap(); - } - - pub fn unstake_tokenfactory_tokens( - app: &mut App, - staking_addr: &Addr, - address: &str, - amount: u128, - ) { - let msg = dao_voting_token_staked::msg::ExecuteMsg::Unstake { - amount: amount.into(), - }; - app.execute_contract(Addr::unchecked(address), staking_addr.clone(), &msg, &[]) - .unwrap(); - } - - pub fn setup_native_token_test(app: &mut App) -> Addr { - let vp_code_id = app.store_code(native_staked_balances_voting_contract()); - - let msg = dao_voting_token_staked::msg::InstantiateMsg { - active_threshold: None, - unstaking_duration: None, - token_info: dao_voting_token_staked::msg::TokenInfo::Existing { - denom: DENOM.to_string(), - }, - }; - - app.instantiate_contract( - vp_code_id, - Addr::unchecked(OWNER), - &msg, - &[], - "native-vp", - None, - ) - .unwrap() - } -} - -mod cw20_setup { - use cosmwasm_std::{to_json_binary, Addr, Uint128}; - use cw20::Cw20Coin; - use cw_multi_test::{App, Executor}; - use cw_utils::Duration; - use dao_testing::contracts::{ - cw20_base_contract, cw20_stake_contract, cw20_staked_balances_voting_contract, - }; - - use super::OWNER; - - pub fn instantiate_cw20(app: &mut App, name: &str, initial_balances: Vec) -> Addr { - let cw20_id = app.store_code(cw20_base_contract()); - let msg = cw20_base::msg::InstantiateMsg { - name: name.to_string(), - symbol: name.to_string(), - decimals: 6, - initial_balances, - mint: None, - marketing: None, - }; - - app.instantiate_contract(cw20_id, Addr::unchecked(OWNER), &msg, &[], "cw20", None) - .unwrap() - } - - pub fn instantiate_cw20_staking( - app: &mut App, - cw20: Addr, - unstaking_duration: Option, - ) -> Addr { - let staking_code_id = app.store_code(cw20_stake_contract()); - let msg = cw20_stake::msg::InstantiateMsg { - owner: Some(OWNER.to_string()), - token_address: cw20.to_string(), - unstaking_duration, - }; - app.instantiate_contract( - staking_code_id, - Addr::unchecked(OWNER), - &msg, - &[], - "staking", - None, - ) - .unwrap() - } - - pub fn instantiate_cw20_vp_contract(app: &mut App, cw20: Addr, staking_contract: Addr) -> Addr { - let vp_code_id = app.store_code(cw20_staked_balances_voting_contract()); - let msg = dao_voting_cw20_staked::msg::InstantiateMsg { - token_info: dao_voting_cw20_staked::msg::TokenInfo::Existing { - address: cw20.to_string(), - staking_contract: dao_voting_cw20_staked::msg::StakingInfo::Existing { - staking_contract_address: staking_contract.to_string(), - }, - }, - active_threshold: None, - }; - app.instantiate_contract(vp_code_id, Addr::unchecked(OWNER), &msg, &[], "vp", None) - .unwrap() - } - - pub fn setup_cw20_test(app: &mut App, initial_balances: Vec) -> (Addr, Addr, Addr) { - // Instantiate cw20 contract - let cw20_addr = instantiate_cw20(app, "test", initial_balances.clone()); - - // Instantiate staking contract - let staking_addr = instantiate_cw20_staking(app, cw20_addr.clone(), None); - - // Instantiate vp contract - let vp_addr = instantiate_cw20_vp_contract(app, cw20_addr.clone(), staking_addr.clone()); - - (staking_addr, cw20_addr, vp_addr) - } - - #[allow(dead_code)] - pub fn stake_cw20_tokens>( - app: &mut App, - staking_addr: &Addr, - cw20_addr: &Addr, - sender: T, - amount: u128, - ) { - let msg = cw20::Cw20ExecuteMsg::Send { - contract: staking_addr.to_string(), - amount: Uint128::new(amount), - msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), - }; - app.execute_contract(Addr::unchecked(sender), cw20_addr.clone(), &msg, &[]) - .unwrap(); - } -} - -mod cw721_setup { - - use cosmwasm_std::{to_json_binary, Addr, Binary, Empty}; - use cw_multi_test::{App, Executor}; - use dao_testing::contracts::{cw721_base_contract, cw721_staked_voting_contract}; - use dao_voting_cw721_staked::state::Config; - - use super::OWNER; - - pub fn stake_cw721( - app: &mut App, - vp_addr: &Addr, - cw721_addr: &Addr, - address: &str, - token_id: &str, - ) { - let msg = cw721_base::msg::ExecuteMsg::::SendNft { - contract: vp_addr.to_string(), - token_id: token_id.to_string(), - msg: Binary::default(), - }; - - app.execute_contract(Addr::unchecked(address), cw721_addr.clone(), &msg, &[]) - .unwrap(); - } - - pub fn unstake_cw721(app: &mut App, vp_addr: &Addr, address: &str, token_id: &str) { - app.execute_contract( - Addr::unchecked(address), - vp_addr.clone(), - &dao_voting_cw721_staked::msg::ExecuteMsg::Unstake { - token_ids: vec![token_id.to_string()], - }, - &[], - ) - .unwrap(); - } - - pub fn setup_cw721_test(app: &mut App, initial_nfts: Vec) -> (Addr, Addr) { - let cw721_code_id = app.store_code(cw721_base_contract()); - let vp_code_id = app.store_code(cw721_staked_voting_contract()); - - let msg = dao_voting_cw721_staked::msg::InstantiateMsg { - nft_contract: dao_voting_cw721_staked::msg::NftContract::New { - code_id: cw721_code_id, - label: "Test NFT contract".to_string(), - msg: to_json_binary(&cw721_base::msg::InstantiateMsg { - name: "Test NFT".to_string(), - symbol: "TEST".to_string(), - minter: OWNER.to_string(), - }) - .unwrap(), - initial_nfts, - }, - active_threshold: None, - unstaking_duration: None, - }; - - let vp_addr = app - .instantiate_contract( - vp_code_id, - Addr::unchecked(OWNER), - &msg, - &[], - "cw721-vp", - None, - ) - .unwrap(); - - let cw721_addr = app - .wrap() - .query_wasm_smart::( - vp_addr.clone(), - &dao_voting_cw721_staked::msg::QueryMsg::Config {}, - ) - .unwrap() - .nft_address; - - (vp_addr, cw721_addr) - } -} diff --git a/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs b/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs index ed01a2256..749e1cd38 100644 --- a/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs +++ b/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs @@ -1,13 +1,15 @@ -use std::borrow::BorrowMut; - use cosmwasm_schema::cw_serde; -use cosmwasm_std::{coin, coins, to_json_binary, Addr, Coin, Empty, Timestamp, Uint128}; +use cosmwasm_std::{coin, to_json_binary, Addr, Coin, Timestamp, Uint128}; use cw20::{Cw20Coin, Expiration, UncheckedDenom}; use cw4::{Member, MemberListResponse}; -use cw_multi_test::{App, BankSudo, Executor, SudoMsg}; +use cw_multi_test::{BankSudo, Executor, SudoMsg}; use cw_ownable::Action; use cw_utils::Duration; -use dao_interface::voting::InfoResponse; +use dao_interface::{token::InitialBalance, voting::InfoResponse}; +use dao_testing::{ + Cw20TestDao, Cw4TestDao, Cw721TestDao, DaoTestingSuite, DaoTestingSuiteBase, InitialNft, + TokenTestDao, GOV_DENOM, MEMBER1, MEMBER2, MEMBER3, OWNER, +}; use crate::{ msg::{ @@ -15,26 +17,13 @@ use crate::{ PendingRewardsResponse, QueryMsg, ReceiveCw20Msg, }, state::{DistributionState, EmissionRate}, - testing::cw20_setup::instantiate_cw20, - ContractError, -}; - -use super::{ - contract_rewards, - cw20_setup::{self, setup_cw20_test}, - cw4_setup::setup_cw4_test, - cw721_setup::{setup_cw721_test, stake_cw721, unstake_cw721}, - native_setup::{ - setup_native_token_test, stake_tokenfactory_tokens, unstake_tokenfactory_tokens, - }, - ADDR1, ADDR2, ADDR3, DENOM, OWNER, }; - +use dao_rewards_distributor::ContractError; pub enum DaoType { CW20, + CW4, CW721, Native, - CW4, } #[cw_serde] @@ -47,7 +36,6 @@ pub struct RewardsConfig { } pub struct SuiteBuilder { - pub _instantiate: InstantiateMsg, pub dao_type: DaoType, pub rewards_config: RewardsConfig, pub cw4_members: Vec, @@ -56,28 +44,25 @@ pub struct SuiteBuilder { impl SuiteBuilder { pub fn base(dao_type: DaoType) -> Self { Self { - _instantiate: InstantiateMsg { - owner: Some(OWNER.to_string()), - }, dao_type, rewards_config: RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Height(10), destination: None, continuous: true, }, cw4_members: vec![ Member { - addr: ADDR1.to_string(), + addr: MEMBER1.to_string(), weight: 2, }, Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 1, }, Member { - addr: ADDR3.to_string(), + addr: MEMBER3.to_string(), weight: 1, }, ], @@ -102,150 +87,133 @@ impl SuiteBuilder { impl SuiteBuilder { pub fn build(mut self) -> Suite { - let owner = Addr::unchecked(OWNER); - let mut suite_built = Suite { - app: App::default(), - owner: Some(owner.clone()), + base: DaoTestingSuiteBase::base(), + core_addr: Addr::unchecked(""), staking_addr: Addr::unchecked(""), voting_power_addr: Addr::unchecked(""), reward_code_id: 0, distribution_contract: Addr::unchecked(""), cw20_addr: Addr::unchecked(""), - reward_denom: DENOM.to_string(), + reward_denom: GOV_DENOM.to_string(), + cw20_dao: None, + cw4_dao: None, + cw721_dao: None, + token_dao: None, }; - // start at 0 height and time - suite_built.app.borrow_mut().update_block(|b| b.height = 0); - suite_built - .app - .borrow_mut() - .update_block(|b| b.time = Timestamp::from_seconds(0)); - match self.dao_type { DaoType::CW4 => { - let (voting_power_addr, dao_voting_addr) = - setup_cw4_test(suite_built.app.borrow_mut(), self.cw4_members); - suite_built.voting_power_addr = voting_power_addr.clone(); - suite_built.staking_addr = dao_voting_addr.clone(); + let dao = suite_built.base.cw4().with_members(self.cw4_members).dao(); + suite_built.core_addr = dao.core_addr.clone(); + suite_built.voting_power_addr = dao.voting_module_addr.clone(); + suite_built.staking_addr = dao.x.group_addr.clone(); + suite_built.cw4_dao = Some(dao); } DaoType::CW20 => { - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - - let (staking_addr, cw20_addr, vp_addr) = - setup_cw20_test(suite_built.app.borrow_mut(), initial_balances.clone()); - - suite_built.voting_power_addr = vp_addr.clone(); - suite_built.cw20_addr = cw20_addr.clone(); - suite_built.staking_addr = staking_addr.clone(); - - for coin in initial_balances.clone() { - suite_built.stake_cw20_tokens(coin.amount.u128(), coin.address.as_str()); - } + let dao = suite_built + .base + .cw20() + .with_initial_balances(vec![ + Cw20Coin { + address: MEMBER1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: MEMBER2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: MEMBER3.to_string(), + amount: Uint128::new(50), + }, + ]) + .dao(); + + suite_built.core_addr = dao.core_addr.clone(); + suite_built.voting_power_addr = dao.voting_module_addr.clone(); + suite_built.cw20_addr = dao.x.cw20_addr.clone(); + suite_built.staking_addr = dao.x.staking_addr.clone(); + suite_built.cw20_dao = Some(dao); } DaoType::CW721 => { - let initial_nfts = vec![ - to_json_binary(&cw721_base::msg::ExecuteMsg::::Mint { - token_id: "1".to_string(), - owner: ADDR1.to_string(), - token_uri: Some("https://jpegs.com".to_string()), - extension: Empty {}, - }) - .unwrap(), - to_json_binary(&cw721_base::msg::ExecuteMsg::::Mint { - token_id: "2".to_string(), - owner: ADDR1.to_string(), - token_uri: Some("https://jpegs.com".to_string()), - extension: Empty {}, - }) - .unwrap(), - to_json_binary(&cw721_base::msg::ExecuteMsg::::Mint { - token_id: "3".to_string(), - owner: ADDR2.to_string(), - token_uri: Some("https://jpegs.com".to_string()), - extension: Empty {}, - }) - .unwrap(), - to_json_binary(&cw721_base::msg::ExecuteMsg::::Mint { - token_id: "4".to_string(), - owner: ADDR3.to_string(), - token_uri: Some("https://jpegs.com".to_string()), - extension: Empty {}, - }) - .unwrap(), - ]; - - let (vp_addr, cw721) = setup_cw721_test(suite_built.app.borrow_mut(), initial_nfts); - - suite_built.voting_power_addr = vp_addr.clone(); - suite_built.staking_addr = cw721.clone(); - - suite_built.stake_nft(ADDR1, 1); - suite_built.stake_nft(ADDR1, 2); - suite_built.stake_nft(ADDR2, 3); - suite_built.stake_nft(ADDR3, 4); + let dao = suite_built + .base + .cw721() + .with_initial_nfts(vec![ + InitialNft { + token_id: "1".to_string(), + owner: MEMBER1.to_string(), + }, + InitialNft { + token_id: "2".to_string(), + owner: MEMBER1.to_string(), + }, + InitialNft { + token_id: "3".to_string(), + owner: MEMBER2.to_string(), + }, + InitialNft { + token_id: "4".to_string(), + owner: MEMBER3.to_string(), + }, + ]) + .dao(); + + suite_built.core_addr = dao.core_addr.clone(); + suite_built.voting_power_addr = dao.voting_module_addr.clone(); + suite_built.staking_addr = dao.x.cw721_addr.clone(); + suite_built.cw721_dao = Some(dao); } DaoType::Native => { - let initial_balances = vec![ - (ADDR1, coins(100, DENOM)), - (ADDR2, coins(50, DENOM)), - (ADDR3, coins(50, DENOM)), - ]; - - // Mint tokens for initial balances - for init_bal in initial_balances { - suite_built - .app - .borrow_mut() - .sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: init_bal.0.to_string(), - amount: init_bal.1, - } - })) - .unwrap(); - } - - // Create Native token staking contract - let vp_addr = setup_native_token_test(suite_built.app.borrow_mut()); - suite_built.voting_power_addr = vp_addr.clone(); - suite_built.staking_addr = vp_addr.clone(); - suite_built.stake_native_tokens(ADDR1, 100); - suite_built.stake_native_tokens(ADDR2, 50); - suite_built.stake_native_tokens(ADDR3, 50); + let dao = suite_built + .base + .token() + .with_initial_balances(vec![ + InitialBalance { + address: MEMBER1.to_string(), + amount: Uint128::new(100), + }, + InitialBalance { + address: MEMBER2.to_string(), + amount: Uint128::new(50), + }, + InitialBalance { + address: MEMBER3.to_string(), + amount: Uint128::new(50), + }, + ]) + .dao(); + + suite_built.core_addr = dao.core_addr.clone(); + suite_built.voting_power_addr = dao.voting_module_addr.clone(); + suite_built.staking_addr = dao.voting_module_addr.clone(); + suite_built.token_dao = Some(dao); } }; + // start at 0 height and time + suite_built.base.app.update_block(|b| { + b.height = 0; + b.time = Timestamp::from_seconds(0); + }); + // initialize the rewards distributor - suite_built.reward_code_id = suite_built.app.borrow_mut().store_code(contract_rewards()); - let reward_addr = suite_built + suite_built.reward_code_id = suite_built.base.rewards_distributor_id; + suite_built.distribution_contract = suite_built + .base .app - .borrow_mut() .instantiate_contract( suite_built.reward_code_id, - owner.clone(), + Addr::unchecked(OWNER), &InstantiateMsg { - owner: Some(owner.clone().into_string()), + owner: Some(OWNER.to_string()), }, &[], "reward", None, ) .unwrap(); - suite_built.distribution_contract = reward_addr.clone(); // depending on the dao type we register rewards differently match self.dao_type { @@ -258,7 +226,7 @@ impl SuiteBuilder { ); match self.rewards_config.denom { UncheckedDenom::Native(_) => { - suite_built.fund_native(1, coin(100_000_000, DENOM.to_string())); + suite_built.fund_native(1, coin(100_000_000, GOV_DENOM.to_string())); } UncheckedDenom::Cw20(_) => { suite_built.fund_cw20( @@ -275,15 +243,16 @@ impl SuiteBuilder { self.rewards_config.denom = match self.rewards_config.denom { UncheckedDenom::Native(denom) => UncheckedDenom::Native(denom), UncheckedDenom::Cw20(_) => UncheckedDenom::Cw20( - instantiate_cw20( - suite_built.app.borrow_mut(), - "rewardcw", - vec![Cw20Coin { - address: OWNER.to_string(), - amount: Uint128::new(1_000_000_000), - }], - ) - .to_string(), + suite_built + .base + .instantiate_cw20( + "rewardcw", + vec![Cw20Coin { + address: OWNER.to_string(), + amount: Uint128::new(1_000_000_000), + }], + ) + .to_string(), ), }; suite_built.reward_denom = match self.rewards_config.denom.clone() { @@ -299,7 +268,7 @@ impl SuiteBuilder { ); match &self.rewards_config.denom { UncheckedDenom::Native(_) => { - suite_built.fund_native(1, coin(100_000_000, DENOM.to_string())); + suite_built.fund_native(1, coin(100_000_000, GOV_DENOM.to_string())); } UncheckedDenom::Cw20(addr) => { suite_built.fund_cw20( @@ -321,9 +290,9 @@ impl SuiteBuilder { } pub struct Suite { - pub app: App, - pub owner: Option, + pub base: DaoTestingSuiteBase, + pub core_addr: Addr, pub staking_addr: Addr, pub voting_power_addr: Addr, pub reward_denom: String, @@ -333,13 +302,19 @@ pub struct Suite { // cw20 type fields pub cw20_addr: Addr, + + // DAO types + pub cw20_dao: Option, + pub cw4_dao: Option, + pub cw721_dao: Option, + pub token_dao: Option, } // SUITE QUERIES impl Suite { pub fn get_time_until_rewards_expiration(&mut self) -> u64 { let distribution = &self.get_distributions().distributions[0]; - let current_block = self.app.block_info(); + let current_block = self.base.app.block_info(); let (expiration_unit, current_unit) = match distribution.active_epoch.ends_at { cw20::Expiration::AtHeight(h) => (h, current_block.height), cw20::Expiration::AtTime(t) => (t.seconds(), current_block.time.seconds()), @@ -358,7 +333,8 @@ impl Suite { address: T, denom: U, ) -> u128 { - self.app + self.base + .app .wrap() .query_balance(address, denom) .unwrap() @@ -375,6 +351,7 @@ impl Suite { address: address.into(), }; let result: cw20::BalanceResponse = self + .base .app .wrap() .query_wasm_smart(contract_addr, &msg) @@ -383,7 +360,8 @@ impl Suite { } pub fn get_distributions(&mut self) -> DistributionsResponse { - self.app + self.base + .app .wrap() .query_wasm_smart( self.distribution_contract.clone(), @@ -397,6 +375,7 @@ impl Suite { pub fn get_distribution(&mut self, id: u64) -> DistributionState { let resp: DistributionState = self + .base .app .wrap() .query_wasm_smart( @@ -409,8 +388,8 @@ impl Suite { pub fn get_undistributed_rewards(&mut self, id: u64) -> Uint128 { let undistributed_rewards: Uint128 = self + .base .app - .borrow_mut() .wrap() .query_wasm_smart( self.distribution_contract.clone(), @@ -422,8 +401,8 @@ impl Suite { pub fn get_owner(&mut self) -> Addr { let ownable_response: cw_ownable::Ownership = self + .base .app - .borrow_mut() .wrap() .query_wasm_smart(self.distribution_contract.clone(), &QueryMsg::Ownership {}) .unwrap(); @@ -431,8 +410,8 @@ impl Suite { } pub fn get_info(&mut self) -> InfoResponse { - self.app - .borrow_mut() + self.base + .app .wrap() .query_wasm_smart(self.distribution_contract.clone(), &QueryMsg::Info {}) .unwrap() @@ -477,8 +456,8 @@ impl Suite { pub fn assert_pending_rewards(&mut self, address: &str, id: u64, expected: u128) { let res: PendingRewardsResponse = self + .base .app - .borrow_mut() .wrap() .query_wasm_smart( self.distribution_contract.clone(), @@ -532,7 +511,8 @@ impl Suite { impl Suite { pub fn withdraw(&mut self, id: u64) { let msg = ExecuteMsg::Withdraw { id }; - self.app + self.base + .app .execute_contract( Addr::unchecked(OWNER), self.distribution_contract.clone(), @@ -544,7 +524,8 @@ impl Suite { pub fn withdraw_error(&mut self, id: u64) -> ContractError { let msg = ExecuteMsg::Withdraw { id }; - self.app + self.base + .app .execute_contract( Addr::unchecked(OWNER), self.distribution_contract.clone(), @@ -560,8 +541,9 @@ impl Suite { let msg = cw4_group::msg::ExecuteMsg::AddHook { addr: self.distribution_contract.to_string(), }; - self.app - .execute_contract(Addr::unchecked(OWNER), addr, &msg, &[]) + self.base + .app + .execute_contract(self.core_addr.clone(), addr, &msg, &[]) .unwrap(); } @@ -594,10 +576,10 @@ impl Suite { vec![] }; - self.app - .borrow_mut() + self.base + .app .execute_contract( - self.owner.clone().unwrap(), + Addr::unchecked(OWNER), self.distribution_contract.clone(), &execute_create_msg, &send_funds, @@ -607,8 +589,8 @@ impl Suite { pub fn mint_native(&mut self, coin: Coin, dest: &str) { // mint the tokens to be funded - self.app - .borrow_mut() + self.base + .app .sudo(SudoMsg::Bank({ BankSudo::Mint { to_address: dest.to_string(), @@ -619,13 +601,13 @@ impl Suite { } pub fn mint_cw20(&mut self, coin: Cw20Coin, name: &str) -> Addr { - cw20_setup::instantiate_cw20(self.app.borrow_mut(), name, vec![coin]) + self.base.instantiate_cw20(name, vec![coin]) } pub fn fund_native(&mut self, id: u64, coin: Coin) { self.mint_native(coin.clone(), OWNER); - self.app - .borrow_mut() + self.base + .app .execute_contract( Addr::unchecked(OWNER), self.distribution_contract.clone(), @@ -637,8 +619,8 @@ impl Suite { pub fn fund_latest_native(&mut self, coin: Coin) { self.mint_native(coin.clone(), OWNER); - self.app - .borrow_mut() + self.base + .app .execute_contract( Addr::unchecked(OWNER), self.distribution_contract.clone(), @@ -650,7 +632,8 @@ impl Suite { pub fn fund_cw20(&mut self, id: u64, coin: Cw20Coin) { let fund_sub_msg = to_json_binary(&ReceiveCw20Msg::Fund(FundMsg { id })).unwrap(); - self.app + self.base + .app .execute_contract( Addr::unchecked(OWNER), Addr::unchecked(coin.address), @@ -666,7 +649,8 @@ impl Suite { pub fn fund_latest_cw20(&mut self, coin: Cw20Coin) { let fund_sub_msg = to_json_binary(&ReceiveCw20Msg::FundLatest {}).unwrap(); - self.app + self.base + .app .execute_contract( Addr::unchecked(OWNER), Addr::unchecked(coin.address), @@ -681,14 +665,14 @@ impl Suite { } pub fn skip_blocks(&mut self, blocks: u64) { - self.app.borrow_mut().update_block(|b| { + self.base.app.update_block(|b| { println!("skipping blocks {:?} -> {:?}", b.height, b.height + blocks); b.height += blocks }); } pub fn skip_seconds(&mut self, seconds: u64) { - self.app.borrow_mut().update_block(|b| { + self.base.app.update_block(|b| { let new_block_time = b.time.plus_seconds(seconds); println!( "skipping seconds {:?} -> {:?}", @@ -707,7 +691,8 @@ impl Suite { pub fn claim_rewards(&mut self, address: &str, id: u64) { let msg = ExecuteMsg::Claim { id }; - self.app + self.base + .app .execute_contract( Addr::unchecked(address), self.distribution_contract.clone(), @@ -724,7 +709,8 @@ impl Suite { amount: Uint128::new(amount), msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), }; - self.app + self.base + .app .execute_contract(Addr::unchecked(sender), self.cw20_addr.clone(), &msg, &[]) .unwrap(); } @@ -733,7 +719,8 @@ impl Suite { let msg = cw20_stake::msg::ExecuteMsg::Unstake { amount: Uint128::new(amount), }; - self.app + self.base + .app .execute_contract( Addr::unchecked(sender), self.staking_addr.clone(), @@ -744,30 +731,31 @@ impl Suite { } pub fn stake_nft(&mut self, sender: &str, token_id: u64) { - stake_cw721( - self.app.borrow_mut(), - &self.voting_power_addr, - &self.staking_addr, + self.base.cw721().stake( + &self.cw721_dao.clone().unwrap(), sender, - &token_id.to_string(), + token_id.to_string(), ) } pub fn unstake_nft(&mut self, sender: &str, token_id: u64) { - unstake_cw721( - self.app.borrow_mut(), - &self.voting_power_addr, + self.base.cw721().unstake( + &self.cw721_dao.clone().unwrap(), sender, - &token_id.to_string(), + token_id.to_string(), ) } pub fn stake_native_tokens(&mut self, address: &str, amount: u128) { - stake_tokenfactory_tokens(self.app.borrow_mut(), &self.staking_addr, address, amount) + self.base + .token() + .stake(&self.token_dao.clone().unwrap(), address, amount) } pub fn unstake_native_tokens(&mut self, address: &str, amount: u128) { - unstake_tokenfactory_tokens(self.app.borrow_mut(), &self.staking_addr, address, amount) + self.base + .token() + .unstake(&self.token_dao.clone().unwrap(), address, amount) } pub fn update_emission_rate( @@ -791,6 +779,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -812,6 +801,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -833,6 +823,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -854,6 +845,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -875,6 +867,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -896,6 +889,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -917,6 +911,7 @@ impl Suite { }; let _resp = self + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -930,13 +925,15 @@ impl Suite { pub fn update_members(&mut self, add: Vec, remove: Vec) { let msg = cw4_group::msg::ExecuteMsg::UpdateMembers { remove, add }; - self.app - .execute_contract(Addr::unchecked(OWNER), self.staking_addr.clone(), &msg, &[]) + self.base + .app + .execute_contract(self.core_addr.clone(), self.staking_addr.clone(), &msg, &[]) .unwrap(); } pub fn query_members(&mut self) -> Vec { let members: MemberListResponse = self + .base .app .wrap() .query_wasm_smart( @@ -957,7 +954,8 @@ impl Suite { expiry: None, }); - self.app + self.base + .app .execute_contract( Addr::unchecked(OWNER), self.distribution_contract.clone(), @@ -966,7 +964,8 @@ impl Suite { ) .unwrap(); - self.app + self.base + .app .execute_contract( Addr::unchecked(new_owner), self.distribution_contract.clone(), diff --git a/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs b/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs index 673e8c9ba..b40752e97 100644 --- a/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs +++ b/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs @@ -1,5 +1,3 @@ -use std::borrow::BorrowMut; - use cosmwasm_std::testing::{mock_dependencies, mock_env}; use cosmwasm_std::{coin, coins, to_json_binary, Addr, Timestamp}; use cosmwasm_std::{Uint128, Uint256}; @@ -10,21 +8,17 @@ use cw_multi_test::Executor; use cw_ownable::OwnershipError; use cw_utils::Duration; use dao_interface::voting::InfoResponse; +use dao_testing::{DaoTestingSuite, GOV_DENOM, MEMBER1, MEMBER2, MEMBER3, MEMBER4, OWNER}; use crate::contract::{CONTRACT_NAME, CONTRACT_VERSION}; +use crate::msg::ExecuteMsg; use crate::msg::{CreateMsg, FundMsg, InstantiateMsg, MigrateMsg}; use crate::state::{EmissionRate, Epoch}; -use crate::testing::native_setup::setup_native_token_test; -use crate::ContractError; -use crate::{ - msg::ExecuteMsg, - testing::{ADDR1, ADDR2, ADDR3, ADDR4, DENOM}, -}; - -use super::{ - suite::{RewardsConfig, SuiteBuilder}, - ALT_DENOM, OWNER, -}; +use dao_rewards_distributor::ContractError; + +use super::suite::{RewardsConfig, SuiteBuilder}; + +const ALT_DENOM: &str = "ualtgovtoken"; // By default, the tests are set up to distribute rewards over 1_000_000 units of time. // Over that time, 100_000_000 token rewards will be distributed. @@ -34,7 +28,7 @@ use super::{ fn test_fund_native_404() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); - let mint_coin = coin(100, DENOM); + let mint_coin = coin(100, GOV_DENOM); suite.mint_native(mint_coin.clone(), OWNER); suite.fund_native(3, mint_coin); @@ -80,24 +74,24 @@ fn test_native_dao_rewards_update_reward_rate() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); suite.assert_undistributed_rewards(1, 90_000_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); suite.assert_undistributed_rewards(1, 80_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_pending_rewards(MEMBER1, 1, 0); // set the rewards rate to half of the current one // now there will be 5_000_000 tokens distributed over 100_000 blocks @@ -106,9 +100,9 @@ fn test_native_dao_rewards_update_reward_rate() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 2_500_000); - suite.assert_pending_rewards(ADDR2, 1, 6_250_000); - suite.assert_pending_rewards(ADDR3, 1, 6_250_000); + suite.assert_pending_rewards(MEMBER1, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 6_250_000); + suite.assert_pending_rewards(MEMBER3, 1, 6_250_000); suite.assert_undistributed_rewards(1, 75_000_000); @@ -119,18 +113,18 @@ fn test_native_dao_rewards_update_reward_rate() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 7_500_000); - suite.assert_pending_rewards(ADDR2, 1, 8_750_000); - suite.assert_pending_rewards(ADDR3, 1, 8_750_000); + suite.assert_pending_rewards(MEMBER1, 1, 7_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 8_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 8_750_000); suite.assert_undistributed_rewards(1, 65_000_000); // skip 2/10ths of the time suite.skip_blocks(200_000); - suite.assert_pending_rewards(ADDR1, 1, 17_500_000); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER1, 1, 17_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); suite.assert_undistributed_rewards(1, 45_000_000); @@ -141,44 +135,44 @@ fn test_native_dao_rewards_update_reward_rate() { suite.skip_blocks(100_000); // assert no pending rewards changed - suite.assert_pending_rewards(ADDR1, 1, 17_500_000); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER1, 1, 17_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); suite.assert_undistributed_rewards(1, 45_000_000); - // assert ADDR1 pre-claim balance - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - // ADDR1 claims their rewards - suite.claim_rewards(ADDR1, 1); - // assert ADDR1 post-claim balance to be pre-claim + pending - suite.assert_native_balance(ADDR1, DENOM, 10_000_000 + 17_500_000); - // assert ADDR1 is now entitled to 0 pending rewards - suite.assert_pending_rewards(ADDR1, 1, 0); + // assert MEMBER1 pre-claim balance + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + // MEMBER1 claims their rewards + suite.claim_rewards(MEMBER1, 1); + // assert MEMBER1 post-claim balance to be pre-claim + pending + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000 + 17_500_000); + // assert MEMBER1 is now entitled to 0 pending rewards + suite.assert_pending_rewards(MEMBER1, 1, 0); // user 2 unstakes their stake - suite.unstake_native_tokens(ADDR2, 50); + suite.unstake_native_tokens(MEMBER2, 50); // skip 1/10th of the time suite.skip_blocks(100_000); - // only the ADDR1 pending rewards should have changed - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); + // only the MEMBER1 pending rewards should have changed + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); suite.assert_undistributed_rewards(1, 45_000_000); - // ADDR2 claims their rewards (has 50 to begin with as they unstaked) - suite.assert_native_balance(ADDR2, DENOM, 50); - suite.claim_rewards(ADDR2, 1); - // assert ADDR2 post-claim balance to be pre-claim + pending and has 0 pending rewards - suite.assert_native_balance(ADDR2, DENOM, 13_750_000 + 50); - suite.assert_pending_rewards(ADDR2, 1, 0); + // MEMBER2 claims their rewards (has 50 to begin with as they unstaked) + suite.assert_native_balance(MEMBER2, GOV_DENOM, 50); + suite.claim_rewards(MEMBER2, 1); + // assert MEMBER2 post-claim balance to be pre-claim + pending and has 0 pending rewards + suite.assert_native_balance(MEMBER2, GOV_DENOM, 13_750_000 + 50); + suite.assert_pending_rewards(MEMBER2, 1, 0); // update the reward rate back to 1_000 / 10blocks // this should now distribute 10_000_000 tokens over 100_000 blocks - // between ADDR1 (2/3rds) and ADDR3 (1/3rd) + // between MEMBER1 (2/3rds) and MEMBER3 (1/3rd) suite.update_emission_rate(1, Duration::Height(10), 1000, true); // update with the same rate does nothing @@ -188,37 +182,37 @@ fn test_native_dao_rewards_update_reward_rate() { suite.skip_blocks(100_000); // assert that rewards are being distributed at the expected rate - suite.assert_pending_rewards(ADDR1, 1, 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000 + 3_333_333); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000 + 3_333_333); suite.assert_undistributed_rewards(1, 35_000_000); - // ADDR3 claims their rewards - suite.assert_native_balance(ADDR3, DENOM, 0); - suite.claim_rewards(ADDR3, 1); - suite.assert_pending_rewards(ADDR3, 1, 0); - suite.assert_native_balance(ADDR3, DENOM, 13_750_000 + 3_333_333); + // MEMBER3 claims their rewards + suite.assert_native_balance(MEMBER3, GOV_DENOM, 0); + suite.claim_rewards(MEMBER3, 1); + suite.assert_pending_rewards(MEMBER3, 1, 0); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 13_750_000 + 3_333_333); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 6_666_666 + 6_666_666 + 1); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666 + 6_666_666 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333); suite.assert_undistributed_rewards(1, 25_000_000); // claim everything so that there are 0 pending rewards - suite.claim_rewards(ADDR3, 1); - suite.claim_rewards(ADDR1, 1); + suite.claim_rewards(MEMBER3, 1); + suite.claim_rewards(MEMBER1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); // update the rewards rate to 40_000_000 per 100_000 blocks. - // split is still 2/3rds to ADDR1 and 1/3rd to ADDR3 + // split is still 2/3rds to MEMBER1 and 1/3rd to MEMBER3 suite.update_emission_rate(1, Duration::Height(10), 4000, true); suite.assert_ends_at(Expiration::AtHeight(1_062_500)); @@ -226,40 +220,41 @@ fn test_native_dao_rewards_update_reward_rate() { let addr1_pending = 20_000_000 * 2 / 3; let addr3_pending = 20_000_000 / 3; - suite.assert_pending_rewards(ADDR1, 1, addr1_pending); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending); suite.assert_undistributed_rewards(1, 5_000_000); - // ADDR2 wakes up to the increased staking rate and stakes 50 tokens - // this brings new split to: [ADDR1: 50%, ADDR2: 25%, ADDR3: 25%] - suite.stake_native_tokens(ADDR2, 50); + // MEMBER2 wakes up to the increased staking rate and stakes 50 tokens + // this brings new split to: [MEMBER1: 50%, MEMBER2: 25%, MEMBER3: 25%] + suite.stake_native_tokens(MEMBER2, 50); suite.skip_blocks(10_000); // allocates 4_000_000 tokens - suite.assert_pending_rewards(ADDR1, 1, addr1_pending + 4_000_000 * 2 / 4); - suite.assert_pending_rewards(ADDR2, 1, 4_000_000 / 4); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending + 4_000_000 / 4); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending + 4_000_000 * 2 / 4); + suite.assert_pending_rewards(MEMBER2, 1, 4_000_000 / 4); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending + 4_000_000 / 4); suite.assert_undistributed_rewards(1, 1_000_000); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER3, 1); let addr1_pending = 0; let addr3_pending = 0; suite.skip_blocks(10_000); // skips from 1,060,000 to 1,070,000, and the end is 1,062,500, so this allocates only 1_000_000 tokens instead of 4_000_000 - suite.assert_pending_rewards(ADDR1, 1, addr1_pending + 1_000_000 * 2 / 4); - suite.assert_pending_rewards(ADDR2, 1, 4_000_000 / 4 + 1_000_000 / 4); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending + 1_000_000 / 4); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending + 1_000_000 * 2 / 4); + suite.assert_pending_rewards(MEMBER2, 1, 4_000_000 / 4 + 1_000_000 / 4); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending + 1_000_000 / 4); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER2, 1); suite.assert_undistributed_rewards(1, 0); // TODO: there's a few denoms remaining here, ensure such cases are handled properly - let remaining_rewards = suite.get_balance_native(suite.distribution_contract.clone(), DENOM); + let remaining_rewards = + suite.get_balance_native(suite.distribution_contract.clone(), GOV_DENOM); println!("Remaining rewards: {}", remaining_rewards); } @@ -268,7 +263,7 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Height(10), destination: None, continuous: true, @@ -282,20 +277,20 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_pending_rewards(MEMBER1, 1, 0); // set the rewards rate to time-based rewards suite.update_emission_rate(1, Duration::Time(10), 500, true); @@ -303,9 +298,9 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 2_500_000); - suite.assert_pending_rewards(ADDR2, 1, 6_250_000); - suite.assert_pending_rewards(ADDR3, 1, 6_250_000); + suite.assert_pending_rewards(MEMBER1, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 6_250_000); + suite.assert_pending_rewards(MEMBER3, 1, 6_250_000); // double the rewards rate // now there will be 10_000_000 tokens distributed over 100_000 seconds @@ -314,16 +309,16 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 7_500_000); - suite.assert_pending_rewards(ADDR2, 1, 8_750_000); - suite.assert_pending_rewards(ADDR3, 1, 8_750_000); + suite.assert_pending_rewards(MEMBER1, 1, 7_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 8_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 8_750_000); // skip 2/10ths of the time suite.skip_seconds(200_000); - suite.assert_pending_rewards(ADDR1, 1, 17_500_000); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER1, 1, 17_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); // pause the rewards distribution suite.pause_emission(1); @@ -332,73 +327,73 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { suite.skip_blocks(100_000); // assert no pending rewards changed - suite.assert_pending_rewards(ADDR1, 1, 17_500_000); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); - - // assert ADDR1 pre-claim balance - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - // ADDR1 claims their rewards - suite.claim_rewards(ADDR1, 1); - // assert ADDR1 post-claim balance to be pre-claim + pending - suite.assert_native_balance(ADDR1, DENOM, 10_000_000 + 17_500_000); - // assert ADDR1 is now entitled to 0 pending rewards - suite.assert_pending_rewards(ADDR1, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 17_500_000); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); + + // assert MEMBER1 pre-claim balance + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + // MEMBER1 claims their rewards + suite.claim_rewards(MEMBER1, 1); + // assert MEMBER1 post-claim balance to be pre-claim + pending + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000 + 17_500_000); + // assert MEMBER1 is now entitled to 0 pending rewards + suite.assert_pending_rewards(MEMBER1, 1, 0); // user 2 unstakes their stake - suite.unstake_native_tokens(ADDR2, 50); + suite.unstake_native_tokens(MEMBER2, 50); // skip 1/10th of the time suite.skip_blocks(100_000); - // only the ADDR1 pending rewards should have changed - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 13_750_000); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000); + // only the MEMBER1 pending rewards should have changed + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 13_750_000); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000); - // ADDR2 claims their rewards (has 50 to begin with as they unstaked) - suite.assert_native_balance(ADDR2, DENOM, 50); - suite.claim_rewards(ADDR2, 1); - // assert ADDR2 post-claim balance to be pre-claim + pending and has 0 pending rewards - suite.assert_native_balance(ADDR2, DENOM, 13_750_000 + 50); - suite.assert_pending_rewards(ADDR2, 1, 0); + // MEMBER2 claims their rewards (has 50 to begin with as they unstaked) + suite.assert_native_balance(MEMBER2, GOV_DENOM, 50); + suite.claim_rewards(MEMBER2, 1); + // assert MEMBER2 post-claim balance to be pre-claim + pending and has 0 pending rewards + suite.assert_native_balance(MEMBER2, GOV_DENOM, 13_750_000 + 50); + suite.assert_pending_rewards(MEMBER2, 1, 0); // update the reward rate back to 1_000 / 10blocks // this should now distribute 10_000_000 tokens over 100_000 blocks - // between ADDR1 (2/3rds) and ADDR3 (1/3rd) + // between MEMBER1 (2/3rds) and MEMBER3 (1/3rd) suite.update_emission_rate(1, Duration::Height(10), 1000, true); // skip 1/10th of the time suite.skip_blocks(100_000); // assert that rewards are being distributed at the expected rate - suite.assert_pending_rewards(ADDR1, 1, 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 13_750_000 + 3_333_333); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 13_750_000 + 3_333_333); - // ADDR3 claims their rewards - suite.assert_native_balance(ADDR3, DENOM, 0); - suite.claim_rewards(ADDR3, 1); - suite.assert_pending_rewards(ADDR3, 1, 0); - suite.assert_native_balance(ADDR3, DENOM, 13_750_000 + 3_333_333); + // MEMBER3 claims their rewards + suite.assert_native_balance(MEMBER3, GOV_DENOM, 0); + suite.claim_rewards(MEMBER3, 1); + suite.assert_pending_rewards(MEMBER3, 1, 0); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 13_750_000 + 3_333_333); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 6_666_666 + 6_666_666 + 1); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666 + 6_666_666 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333); // claim everything so that there are 0 pending rewards - suite.claim_rewards(ADDR3, 1); - suite.claim_rewards(ADDR1, 1); + suite.claim_rewards(MEMBER3, 1); + suite.claim_rewards(MEMBER1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); // update the rewards rate to 40_000_000 per 100_000 seconds. - // split is still 2/3rds to ADDR1 and 1/3rd to ADDR3 + // split is still 2/3rds to MEMBER1 and 1/3rd to MEMBER3 suite.update_emission_rate(1, Duration::Time(10), 4000, true); suite.assert_ends_at(Expiration::AtTime(Timestamp::from_seconds(462_500))); @@ -406,34 +401,35 @@ fn test_native_dao_rewards_reward_rate_switch_unit() { let addr1_pending = 20_000_000 * 2 / 3; let addr3_pending = 20_000_000 / 3; - suite.assert_pending_rewards(ADDR1, 1, addr1_pending); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending); - // ADDR2 wakes up to the increased staking rate and stakes 50 tokens - // this brings new split to: [ADDR1: 50%, ADDR2: 25%, ADDR3: 25%] - suite.stake_native_tokens(ADDR2, 50); + // MEMBER2 wakes up to the increased staking rate and stakes 50 tokens + // this brings new split to: [MEMBER1: 50%, MEMBER2: 25%, MEMBER3: 25%] + suite.stake_native_tokens(MEMBER2, 50); suite.skip_seconds(10_000); // allocates 4_000_000 tokens - suite.assert_pending_rewards(ADDR1, 1, addr1_pending + 4_000_000 * 2 / 4); - suite.assert_pending_rewards(ADDR2, 1, 4_000_000 / 4); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending + 4_000_000 / 4); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending + 4_000_000 * 2 / 4); + suite.assert_pending_rewards(MEMBER2, 1, 4_000_000 / 4); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending + 4_000_000 / 4); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER3, 1); let addr1_pending = 0; let addr3_pending = 0; suite.skip_seconds(10_000); // skips from 460,000 to 470,000, and the end is 462,500, so this allocates only 1_000_000 tokens instead of 4_000_000 - suite.assert_pending_rewards(ADDR1, 1, addr1_pending + 1_000_000 * 2 / 4); - suite.assert_pending_rewards(ADDR2, 1, 4_000_000 / 4 + 1_000_000 / 4); - suite.assert_pending_rewards(ADDR3, 1, addr3_pending + 1_000_000 / 4); + suite.assert_pending_rewards(MEMBER1, 1, addr1_pending + 1_000_000 * 2 / 4); + suite.assert_pending_rewards(MEMBER2, 1, 4_000_000 / 4 + 1_000_000 / 4); + suite.assert_pending_rewards(MEMBER3, 1, addr3_pending + 1_000_000 / 4); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER2, 1); // TODO: there's a few denoms remaining here, ensure such cases are handled properly - let remaining_rewards = suite.get_balance_native(suite.distribution_contract.clone(), DENOM); + let remaining_rewards = + suite.get_balance_native(suite.distribution_contract.clone(), GOV_DENOM); println!("Remaining rewards: {}", remaining_rewards); } @@ -448,80 +444,80 @@ fn test_cw20_dao_native_rewards_block_height_based() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their rewards - suite.unstake_cw20_tokens(50, ADDR2); - suite.unstake_cw20_tokens(50, ADDR3); + // MEMBER2 and MEMBER3 unstake their rewards + suite.unstake_cw20_tokens(50, MEMBER2); + suite.unstake_cw20_tokens(50, MEMBER3); // skip 1/10th of the time suite.skip_blocks(100_000); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR2 and ADDR3 wake up, claim and restake their rewards - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up, claim and restake their rewards + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - suite.stake_cw20_tokens(50, ADDR2); + suite.stake_cw20_tokens(50, MEMBER2); // skip 3/10th of the time suite.skip_blocks(300_000); - suite.stake_cw20_tokens(50, ADDR3); + suite.stake_cw20_tokens(50, MEMBER3); - suite.assert_pending_rewards(ADDR1, 1, 30_000_000); - suite.assert_pending_rewards(ADDR2, 1, 10_000_000); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 30_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 0); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); let remaining_time = suite.get_time_until_rewards_expiration(); suite.skip_blocks(remaining_time - 100_000); - suite.claim_rewards(ADDR1, 1); - suite.unstake_cw20_tokens(100, ADDR1); - suite.assert_pending_rewards(ADDR1, 1, 0); + suite.claim_rewards(MEMBER1, 1); + suite.unstake_cw20_tokens(100, MEMBER1); + suite.assert_pending_rewards(MEMBER1, 1, 0); suite.skip_blocks(100_000); - suite.unstake_cw20_tokens(50, ADDR2); + suite.unstake_cw20_tokens(50, MEMBER2); suite.skip_blocks(100_000); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); - let addr1_bal = suite.get_balance_native(ADDR1, DENOM); - let addr2_bal = suite.get_balance_native(ADDR2, DENOM); - let addr3_bal = suite.get_balance_native(ADDR3, DENOM); + let addr1_bal = suite.get_balance_native(MEMBER1, GOV_DENOM); + let addr2_bal = suite.get_balance_native(MEMBER2, GOV_DENOM); + let addr3_bal = suite.get_balance_native(MEMBER3, GOV_DENOM); println!("Balances: {}, {}, {}", addr1_bal, addr2_bal, addr3_bal); } @@ -537,41 +533,41 @@ fn test_cw721_dao_rewards() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their nfts - suite.unstake_nft(ADDR2, 3); - suite.unstake_nft(ADDR3, 4); + // MEMBER2 and MEMBER3 unstake their nfts + suite.unstake_nft(MEMBER2, 3); + suite.unstake_nft(MEMBER3, 4); // skip 1/10th of the time suite.skip_blocks(100_000); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR2 and ADDR3 wake up, claim and restake their nfts - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up, claim and restake their nfts + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - suite.stake_nft(ADDR2, 3); - suite.stake_nft(ADDR3, 4); + suite.stake_nft(MEMBER2, 3); + suite.stake_nft(MEMBER3, 4); } #[test] @@ -582,13 +578,13 @@ fn test_claim_zero_rewards() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); - // ADDR1 attempts to claim again - suite.claim_rewards(ADDR1, 1); + // MEMBER1 attempts to claim again + suite.claim_rewards(MEMBER1, 1); } #[test] @@ -598,7 +594,7 @@ fn test_native_dao_cw20_rewards_time_based() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Cw20(DENOM.to_string()), + denom: UncheckedDenom::Cw20(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: true, @@ -614,41 +610,41 @@ fn test_native_dao_cw20_rewards_time_based() { // skip 1/10th of the time suite.skip_seconds(100_000); - // suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + // suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_cw20_balance(cw20_denom, ADDR1, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_cw20_balance(cw20_denom, MEMBER1, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their stake - suite.unstake_cw20_tokens(50, ADDR2); - suite.unstake_cw20_tokens(50, ADDR3); + // MEMBER2 and MEMBER3 unstake their stake + suite.unstake_cw20_tokens(50, MEMBER2); + suite.unstake_cw20_tokens(50, MEMBER3); // skip 1/10th of the time suite.skip_seconds(100_000); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR2 and ADDR3 wake up and claim their rewards - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up and claim their rewards + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - suite.assert_cw20_balance(cw20_denom, ADDR1, 10_000_000); - suite.assert_cw20_balance(cw20_denom, ADDR2, 5_000_000); + suite.assert_cw20_balance(cw20_denom, MEMBER1, 10_000_000); + suite.assert_cw20_balance(cw20_denom, MEMBER2, 5_000_000); } #[test] @@ -658,7 +654,7 @@ fn test_native_dao_rewards_time_based() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: true, @@ -672,44 +668,44 @@ fn test_native_dao_rewards_time_based() { // skip 1/10th of the time suite.skip_seconds(100_000); - // suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + // suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their stake - suite.unstake_native_tokens(ADDR2, 50); - suite.unstake_native_tokens(ADDR3, 50); + // MEMBER2 and MEMBER3 unstake their stake + suite.unstake_native_tokens(MEMBER2, 50); + suite.unstake_native_tokens(MEMBER3, 50); // skip 1/10th of the time suite.skip_seconds(100_000); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR2 and ADDR3 wake up, claim and restake their rewards - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up, claim and restake their rewards + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - let addr1_balance = suite.get_balance_native(ADDR1, DENOM); - let addr2_balance = suite.get_balance_native(ADDR2, DENOM); + let addr1_balance = suite.get_balance_native(MEMBER1, GOV_DENOM); + let addr2_balance = suite.get_balance_native(MEMBER2, GOV_DENOM); - suite.stake_native_tokens(ADDR1, addr1_balance); - suite.stake_native_tokens(ADDR2, addr2_balance); + suite.stake_native_tokens(MEMBER1, addr1_balance); + suite.stake_native_tokens(MEMBER2, addr2_balance); } // all of the `+1` corrections highlight rounding @@ -720,22 +716,22 @@ fn test_native_dao_rewards_time_based_with_rounding() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW4) .with_rewards_config(RewardsConfig { amount: 100, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Time(100), destination: None, continuous: true, }) .with_cw4_members(vec![ Member { - addr: ADDR1.to_string(), + addr: MEMBER1.to_string(), weight: 140, }, Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 40, }, Member { - addr: ADDR3.to_string(), + addr: MEMBER3.to_string(), weight: 20, }, ]) @@ -748,99 +744,99 @@ fn test_native_dao_rewards_time_based_with_rounding() { // skip 1 interval suite.skip_seconds(100); - suite.assert_pending_rewards(ADDR1, 1, 70); - suite.assert_pending_rewards(ADDR2, 1, 20); - suite.assert_pending_rewards(ADDR3, 1, 10); + suite.assert_pending_rewards(MEMBER1, 1, 70); + suite.assert_pending_rewards(MEMBER2, 1, 20); + suite.assert_pending_rewards(MEMBER3, 1, 10); // change voting power of one of the members and claim suite.update_members( vec![Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 60, }], vec![], ); - suite.claim_rewards(ADDR2, 1); - suite.assert_native_balance(ADDR2, DENOM, 20); - suite.assert_pending_rewards(ADDR2, 1, 0); + suite.claim_rewards(MEMBER2, 1); + suite.assert_native_balance(MEMBER2, GOV_DENOM, 20); + suite.assert_pending_rewards(MEMBER2, 1, 0); // skip 1 interval suite.skip_seconds(100); - suite.assert_pending_rewards(ADDR1, 1, 70 + 63); - suite.assert_pending_rewards(ADDR2, 1, 27); - suite.assert_pending_rewards(ADDR3, 1, 10 + 9); + suite.assert_pending_rewards(MEMBER1, 1, 70 + 63); + suite.assert_pending_rewards(MEMBER2, 1, 27); + suite.assert_pending_rewards(MEMBER3, 1, 10 + 9); // increase reward rate and claim suite.update_emission_rate(1, Duration::Time(100), 150, true); - suite.claim_rewards(ADDR3, 1); - suite.assert_native_balance(ADDR3, DENOM, 10 + 9); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.claim_rewards(MEMBER3, 1); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 10 + 9); + suite.assert_pending_rewards(MEMBER3, 1, 0); // skip 1 interval suite.skip_seconds(100); - suite.assert_pending_rewards(ADDR1, 1, 70 + 63 + 95 + 1); - suite.assert_pending_rewards(ADDR2, 1, 27 + 40 + 1); - suite.assert_pending_rewards(ADDR3, 1, 13); + suite.assert_pending_rewards(MEMBER1, 1, 70 + 63 + 95 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 27 + 40 + 1); + suite.assert_pending_rewards(MEMBER3, 1, 13); // claim rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 70 + 63 + 95 + 1); - suite.assert_pending_rewards(ADDR1, 1, 0); + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 70 + 63 + 95 + 1); + suite.assert_pending_rewards(MEMBER1, 1, 0); // skip 3 intervals suite.skip_seconds(300); - suite.assert_pending_rewards(ADDR1, 1, 3 * 95 + 1); - suite.assert_pending_rewards(ADDR2, 1, 27 + 4 * 40 + 1 + 1 + 1); - suite.assert_pending_rewards(ADDR3, 1, 4 * 13 + 1 + 1); + suite.assert_pending_rewards(MEMBER1, 1, 3 * 95 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 27 + 4 * 40 + 1 + 1 + 1); + suite.assert_pending_rewards(MEMBER3, 1, 4 * 13 + 1 + 1); // change voting power for all suite.update_members( vec![ Member { - addr: ADDR1.to_string(), + addr: MEMBER1.to_string(), weight: 100, }, Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 80, }, Member { - addr: ADDR3.to_string(), + addr: MEMBER3.to_string(), weight: 40, }, ], vec![], ); - suite.claim_rewards(ADDR2, 1); - suite.assert_native_balance(ADDR2, DENOM, 20 + 27 + 4 * 40 + 1 + 1 + 1); - suite.assert_pending_rewards(ADDR2, 1, 0); + suite.claim_rewards(MEMBER2, 1); + suite.assert_native_balance(MEMBER2, GOV_DENOM, 20 + 27 + 4 * 40 + 1 + 1 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); // skip 1 interval suite.skip_seconds(100); - suite.assert_pending_rewards(ADDR1, 1, 3 * 95 + 1 + 68); - suite.assert_pending_rewards(ADDR2, 1, 54); - suite.assert_pending_rewards(ADDR3, 1, 4 * 13 + 1 + 1 + 27); + suite.assert_pending_rewards(MEMBER1, 1, 3 * 95 + 1 + 68); + suite.assert_pending_rewards(MEMBER2, 1, 54); + suite.assert_pending_rewards(MEMBER3, 1, 4 * 13 + 1 + 1 + 27); // claim all - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); - suite.assert_native_balance(ADDR1, DENOM, 70 + 63 + 95 + 1 + 3 * 95 + 1 + 68); - suite.assert_native_balance(ADDR2, DENOM, 20 + 27 + 4 * 40 + 1 + 1 + 1 + 54); - suite.assert_native_balance(ADDR3, DENOM, 10 + 9 + 4 * 13 + 1 + 1 + 27); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 70 + 63 + 95 + 1 + 3 * 95 + 1 + 68); + suite.assert_native_balance(MEMBER2, GOV_DENOM, 20 + 27 + 4 * 40 + 1 + 1 + 1 + 54); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 10 + 9 + 4 * 13 + 1 + 1 + 27); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); // TODO: fix this rug of 3 udenom by the distribution contract suite.assert_native_balance( suite.distribution_contract.as_str(), - DENOM, + GOV_DENOM, 100_000_000 - (100 * 2 + 150 * 5) + 3, ); } @@ -868,6 +864,7 @@ fn test_immediate_emission() { // create distribution suite + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -878,9 +875,9 @@ fn test_immediate_emission() { .unwrap(); // users immediately have access to rewards - suite.assert_pending_rewards(ADDR1, 2, 50_000_000); - suite.assert_pending_rewards(ADDR2, 2, 25_000_000); - suite.assert_pending_rewards(ADDR3, 2, 25_000_000); + suite.assert_pending_rewards(MEMBER1, 2, 50_000_000); + suite.assert_pending_rewards(MEMBER2, 2, 25_000_000); + suite.assert_pending_rewards(MEMBER3, 2, 25_000_000); // ensure undistributed rewards are immediately 0 suite.assert_undistributed_rewards(2, 0); @@ -889,16 +886,16 @@ fn test_immediate_emission() { suite.fund_native(2, coin(100_000_000, ALT_DENOM)); // users immediately have access to new rewards - suite.assert_pending_rewards(ADDR1, 2, 2 * 50_000_000); - suite.assert_pending_rewards(ADDR2, 2, 2 * 25_000_000); - suite.assert_pending_rewards(ADDR3, 2, 2 * 25_000_000); + suite.assert_pending_rewards(MEMBER1, 2, 2 * 50_000_000); + suite.assert_pending_rewards(MEMBER2, 2, 2 * 25_000_000); + suite.assert_pending_rewards(MEMBER3, 2, 2 * 25_000_000); // ensure undistributed rewards are immediately 0 suite.assert_undistributed_rewards(2, 0); // a new user stakes tokens - suite.mint_native(coin(200, DENOM), ADDR4); - suite.stake_native_tokens(ADDR4, 200); + suite.mint_native(coin(200, GOV_DENOM), MEMBER4); + suite.stake_native_tokens(MEMBER4, 200); // skip 2 blocks so stake takes effect suite.skip_blocks(2); @@ -906,22 +903,22 @@ fn test_immediate_emission() { // another fund takes into account new voting power suite.fund_native(2, coin(100_000_000, ALT_DENOM)); - suite.assert_pending_rewards(ADDR1, 2, 2 * 50_000_000 + 25_000_000); - suite.assert_pending_rewards(ADDR2, 2, 2 * 25_000_000 + 12_500_000); - suite.assert_pending_rewards(ADDR3, 2, 2 * 25_000_000 + 12_500_000); - suite.assert_pending_rewards(ADDR4, 2, 50_000_000); + suite.assert_pending_rewards(MEMBER1, 2, 2 * 50_000_000 + 25_000_000); + suite.assert_pending_rewards(MEMBER2, 2, 2 * 25_000_000 + 12_500_000); + suite.assert_pending_rewards(MEMBER3, 2, 2 * 25_000_000 + 12_500_000); + suite.assert_pending_rewards(MEMBER4, 2, 50_000_000); // ensure undistributed rewards are immediately 0 suite.assert_undistributed_rewards(2, 0); - suite.claim_rewards(ADDR1, 2); - suite.claim_rewards(ADDR2, 2); - suite.claim_rewards(ADDR3, 2); - suite.claim_rewards(ADDR4, 2); + suite.claim_rewards(MEMBER1, 2); + suite.claim_rewards(MEMBER2, 2); + suite.claim_rewards(MEMBER3, 2); + suite.claim_rewards(MEMBER4, 2); - suite.unstake_native_tokens(ADDR1, 100); - suite.unstake_native_tokens(ADDR2, 50); - suite.unstake_native_tokens(ADDR3, 50); + suite.unstake_native_tokens(MEMBER1, 100); + suite.unstake_native_tokens(MEMBER2, 50); + suite.unstake_native_tokens(MEMBER3, 50); // skip 2 blocks so stake takes effect suite.skip_blocks(2); @@ -929,10 +926,10 @@ fn test_immediate_emission() { // another fund takes into account new voting power suite.fund_native(2, coin(100_000_000, ALT_DENOM)); - suite.assert_pending_rewards(ADDR1, 2, 0); - suite.assert_pending_rewards(ADDR2, 2, 0); - suite.assert_pending_rewards(ADDR3, 2, 0); - suite.assert_pending_rewards(ADDR4, 2, 100_000_000); + suite.assert_pending_rewards(MEMBER1, 2, 0); + suite.assert_pending_rewards(MEMBER2, 2, 0); + suite.assert_pending_rewards(MEMBER3, 2, 0); + suite.assert_pending_rewards(MEMBER4, 2, 100_000_000); // ensure undistributed rewards are immediately 0 suite.assert_undistributed_rewards(2, 0); @@ -946,9 +943,9 @@ fn test_immediate_emission_fails_if_no_voting_power() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); // all users unstake - suite.unstake_native_tokens(ADDR1, 100); - suite.unstake_native_tokens(ADDR2, 50); - suite.unstake_native_tokens(ADDR3, 50); + suite.unstake_native_tokens(MEMBER1, 100); + suite.unstake_native_tokens(MEMBER2, 50); + suite.unstake_native_tokens(MEMBER3, 50); // skip 2 blocks since the contract depends on the previous block's total // voting power, and voting power takes 1 block to take effect. so if voting @@ -969,6 +966,7 @@ fn test_immediate_emission_fails_if_no_voting_power() { // create and fund distribution suite + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -990,78 +988,78 @@ fn test_transition_to_immediate() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 unstakes their stake - suite.unstake_native_tokens(ADDR2, 50); + // MEMBER2 unstakes their stake + suite.unstake_native_tokens(MEMBER2, 50); // skip 1/10th of the time suite.skip_blocks(100_000); - // because ADDR2 is not staking, ADDR1 and ADDR3 receive the rewards. ADDR2 + // because MEMBER2 is not staking, MEMBER1 and MEMBER3 receive the rewards. MEMBER2 // should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000 + 3_333_333); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000 + 3_333_333); - // ADDR2 claims their rewards - suite.claim_rewards(ADDR2, 1); - suite.assert_pending_rewards(ADDR2, 1, 0); + // MEMBER2 claims their rewards + suite.claim_rewards(MEMBER2, 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); // switching to immediate emission instantly distributes the remaining 70M suite.set_immediate_emission(1); - // ADDR1 and ADDR3 split the rewards, and ADDR2 gets none - suite.assert_pending_rewards(ADDR1, 1, 6_666_666 + 46_666_666 + 1); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000 + 3_333_333 + 23_333_333); + // MEMBER1 and MEMBER3 split the rewards, and MEMBER2 gets none + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666 + 46_666_666 + 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000 + 3_333_333 + 23_333_333); // claim all rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER3, 1); - // ADDR3 unstakes their stake, leaving only ADDR1 staked - suite.unstake_native_tokens(ADDR3, 50); + // MEMBER3 unstakes their stake, leaving only MEMBER1 staked + suite.unstake_native_tokens(MEMBER3, 50); // skip 2 blocks so unstake takes effect suite.skip_blocks(2); // another fund immediately adds to the pending rewards - suite.mint_native(coin(100_000_000, DENOM), OWNER); - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.mint_native(coin(100_000_000, GOV_DENOM), OWNER); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); - // ADDR1 gets all - suite.assert_pending_rewards(ADDR1, 1, 100_000_000); + // MEMBER1 gets all + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000); // change back to linear emission suite.update_emission_rate(1, Duration::Height(10), 1000, true); // fund with 100M again - suite.mint_native(coin(100_000_000, DENOM), OWNER); - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.mint_native(coin(100_000_000, GOV_DENOM), OWNER); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); - // ADDR1 has same pending as before - suite.assert_pending_rewards(ADDR1, 1, 100_000_000); + // MEMBER1 has same pending as before + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000); // skip 1/10th of the time suite.skip_blocks(100_000); - // ADDR1 has new linearly distributed rewards - suite.assert_pending_rewards(ADDR1, 1, 100_000_000 + 10_000_000); + // MEMBER1 has new linearly distributed rewards + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000 + 10_000_000); } #[test] @@ -1075,44 +1073,44 @@ fn test_native_dao_rewards() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 10_000_000); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 10_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their stake - suite.unstake_native_tokens(ADDR2, 50); - suite.unstake_native_tokens(ADDR3, 50); + // MEMBER2 and MEMBER3 unstake their stake + suite.unstake_native_tokens(MEMBER2, 50); + suite.unstake_native_tokens(MEMBER3, 50); // skip 1/10th of the time suite.skip_blocks(100_000); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 5_000_000); - suite.assert_pending_rewards(ADDR3, 1, 5_000_000); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 5_000_000); - // ADDR2 and ADDR3 wake up, claim and restake their rewards - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up, claim and restake their rewards + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - let addr1_balance = suite.get_balance_native(ADDR1, DENOM); - let addr2_balance = suite.get_balance_native(ADDR2, DENOM); + let addr1_balance = suite.get_balance_native(MEMBER1, GOV_DENOM); + let addr2_balance = suite.get_balance_native(MEMBER2, GOV_DENOM); - suite.stake_native_tokens(ADDR1, addr1_balance); - suite.stake_native_tokens(ADDR2, addr2_balance); + suite.stake_native_tokens(MEMBER1, addr1_balance); + suite.stake_native_tokens(MEMBER2, addr2_balance); } #[test] @@ -1126,39 +1124,39 @@ fn test_continuous_backfill_latest_voting_power() { // skip all of the time suite.skip_blocks(1_000_000); - suite.assert_pending_rewards(ADDR1, 1, 50_000_000); - suite.assert_pending_rewards(ADDR2, 1, 25_000_000); - suite.assert_pending_rewards(ADDR3, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 25_000_000); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); // skip 1/10th of the time suite.skip_blocks(100_000); // change voting powers (1 = 200, 2 = 50, 3 = 50) - suite.stake_native_tokens(ADDR1, 100); + suite.stake_native_tokens(MEMBER1, 100); // skip 1/10th of the time suite.skip_blocks(100_000); // change voting powers again (1 = 50, 2 = 100, 3 = 100) - suite.unstake_native_tokens(ADDR1, 150); - suite.stake_native_tokens(ADDR2, 50); - suite.stake_native_tokens(ADDR3, 50); + suite.unstake_native_tokens(MEMBER1, 150); + suite.stake_native_tokens(MEMBER2, 50); + suite.stake_native_tokens(MEMBER3, 50); // skip 1/10th of the time suite.skip_blocks(100_000); // fund with 100M - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // since this is continuous, rewards should backfill based on the latest // voting powers. we skipped 30% of the time, so 30M should be distributed - suite.assert_pending_rewards(ADDR1, 1, 6_000_000); - suite.assert_pending_rewards(ADDR2, 1, 12_000_000); - suite.assert_pending_rewards(ADDR3, 1, 12_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 6_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 12_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 12_000_000); } #[test] @@ -1172,124 +1170,128 @@ fn test_cw4_dao_rewards() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // remove the second member - suite.update_members(vec![], vec![ADDR2.to_string()]); + suite.update_members(vec![], vec![MEMBER2.to_string()]); suite.query_members(); // skip 1/10th of the time suite.skip_blocks(100_000); - // now that ADDR2 is no longer a member, ADDR1 and ADDR3 will split the rewards - suite.assert_pending_rewards(ADDR1, 1, 5_000_000 + 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333 + 2_500_000); + // now that MEMBER2 is no longer a member, MEMBER1 and MEMBER3 will split the rewards + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000 + 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333 + 2_500_000); // reintroduce the 2nd member with double the vp let add_member_2 = Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 2, }; suite.update_members(vec![add_member_2], vec![]); suite.query_members(); - // now the vp split is [ADDR1: 40%, ADDR2: 40%, ADDR3: 20%] + // now the vp split is [MEMBER1: 40%, MEMBER2: 40%, MEMBER3: 20%] // meaning the token reward per 100k blocks is 4mil, 4mil, 2mil - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 5_000_000 + 6_666_666); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 5_000_000 + 6_666_666); - // assert pending rewards are still the same (other than ADDR1) - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333 + 2_500_000); + // assert pending rewards are still the same (other than MEMBER1) + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333 + 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 4_000_000); - suite.assert_pending_rewards(ADDR2, 1, 6_500_000); - suite.assert_pending_rewards(ADDR3, 1, 7_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 4_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 6_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 7_833_333); // skip 1/2 of time, leaving 200k blocks left suite.skip_blocks(500_000); - suite.assert_pending_rewards(ADDR1, 1, 24_000_000); - suite.assert_pending_rewards(ADDR2, 1, 26_500_000); - suite.assert_pending_rewards(ADDR3, 1, 17_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 24_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 26_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 17_833_333); // remove all members suite.update_members( vec![], - vec![ADDR1.to_string(), ADDR2.to_string(), ADDR3.to_string()], + vec![ + MEMBER1.to_string(), + MEMBER2.to_string(), + MEMBER3.to_string(), + ], ); - suite.assert_pending_rewards(ADDR1, 1, 24_000_000); - suite.assert_pending_rewards(ADDR2, 1, 26_500_000); - suite.assert_pending_rewards(ADDR3, 1, 17_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 24_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 26_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 17_833_333); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 24_000_000); - suite.assert_pending_rewards(ADDR2, 1, 26_500_000); - suite.assert_pending_rewards(ADDR3, 1, 17_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 24_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 26_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 17_833_333); suite.update_members( vec![ Member { - addr: ADDR1.to_string(), + addr: MEMBER1.to_string(), weight: 2, }, Member { - addr: ADDR2.to_string(), + addr: MEMBER2.to_string(), weight: 2, }, Member { - addr: ADDR3.to_string(), + addr: MEMBER3.to_string(), weight: 1, }, ], vec![], ); - suite.assert_pending_rewards(ADDR1, 1, 24_000_000); - suite.assert_pending_rewards(ADDR2, 1, 26_500_000); - suite.assert_pending_rewards(ADDR3, 1, 17_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 24_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 26_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 17_833_333); - suite.claim_rewards(ADDR1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_native_balance(ADDR1, DENOM, 35_666_666); + suite.claim_rewards(MEMBER1, 1); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 35_666_666); // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 4_000_000); - suite.assert_pending_rewards(ADDR2, 1, 30_500_000); - suite.assert_pending_rewards(ADDR3, 1, 19_833_333); + suite.assert_pending_rewards(MEMBER1, 1, 4_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 30_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 19_833_333); // at the very expiration block, claim rewards - suite.claim_rewards(ADDR2, 1); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_native_balance(ADDR2, DENOM, 30_500_000); + suite.claim_rewards(MEMBER2, 1); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_native_balance(MEMBER2, GOV_DENOM, 30_500_000); suite.skip_blocks(100_000); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER3, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 0); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 0); let contract = suite.distribution_contract.clone(); // for 100k blocks there were no members so some rewards are remaining in the contract. - let contract_token_balance = suite.get_balance_native(contract.clone(), DENOM); + let contract_token_balance = suite.get_balance_native(contract.clone(), GOV_DENOM); assert!(contract_token_balance > 0); } @@ -1299,7 +1301,7 @@ fn test_fund_multiple_denoms() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); let alt_coin = coin(100_000_000, ALT_DENOM); - let coin = coin(100_000_000, DENOM); + let coin = coin(100_000_000, GOV_DENOM); suite.mint_native(alt_coin.clone(), OWNER); suite.mint_native(coin.clone(), OWNER); let hook_caller = suite.staking_addr.to_string(); @@ -1316,8 +1318,8 @@ fn test_fund_multiple_denoms() { ); suite + .base .app - .borrow_mut() .execute_contract( Addr::unchecked(OWNER), suite.distribution_contract.clone(), @@ -1363,7 +1365,7 @@ fn test_fund_cw20_with_invalid_cw20_receive_msg() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20).build(); let unregistered_cw20_coin = Cw20Coin { - address: ADDR1.to_string(), + address: MEMBER1.to_string(), amount: Uint128::new(1_000_000), }; @@ -1371,9 +1373,10 @@ fn test_fund_cw20_with_invalid_cw20_receive_msg() { let fund_sub_msg = to_json_binary(&"not_the_fund: {}").unwrap(); suite + .base .app .execute_contract( - Addr::unchecked(ADDR1), + Addr::unchecked(MEMBER1), new_cw20_mint.clone(), &cw20::Cw20ExecuteMsg::Send { contract: suite.distribution_contract.to_string(), @@ -1392,7 +1395,7 @@ fn test_fund_invalid_cw20_denom() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20).build(); let unregistered_cw20_coin = Cw20Coin { - address: ADDR1.to_string(), + address: MEMBER1.to_string(), amount: Uint128::new(1_000_000), }; @@ -1420,30 +1423,30 @@ fn test_withdraw_alternative_destination_address() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // user 1 and 2 claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); // user 2 unstakes - suite.unstake_native_tokens(ADDR2, 50); + suite.unstake_native_tokens(MEMBER2, 50); suite.skip_blocks(100_000); let distribution_contract = suite.distribution_contract.to_string(); - suite.assert_native_balance(subdao_addr.as_str(), DENOM, 0); + suite.assert_native_balance(subdao_addr.as_str(), GOV_DENOM, 0); let pre_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); suite.withdraw(1); let post_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); - let post_withdraw_subdao_balance = suite.get_balance_native(subdao_addr.to_string(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); + let post_withdraw_subdao_balance = suite.get_balance_native(subdao_addr.to_string(), GOV_DENOM); // after withdraw the balance of the subdao should be the same // as pre-withdraw-distributor-bal minus post-withdraw-distributor-bal @@ -1460,30 +1463,30 @@ fn test_withdraw_block_based() { // skip 1/10th of the time suite.skip_blocks(100_000); - // suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - // suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - // suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + // suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + // suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + // suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // user 1 and 2 claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); // user 2 unstakes - suite.unstake_native_tokens(ADDR2, 50); + suite.unstake_native_tokens(MEMBER2, 50); suite.skip_blocks(100_000); let distribution_contract = suite.distribution_contract.to_string(); let pre_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); - suite.assert_native_balance(suite.owner.clone().unwrap().as_str(), DENOM, 0); + suite.assert_native_balance(OWNER, GOV_DENOM, 0); suite.withdraw(1); let post_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); - let post_withdraw_owner_balance = suite.get_balance_native(suite.owner.clone().unwrap(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); + let post_withdraw_owner_balance = suite.get_balance_native(OWNER, GOV_DENOM); // after withdraw the balance of the owner should be the same // as pre-withdraw-distributor-bal minus post-withdraw-distributor-bal @@ -1505,25 +1508,25 @@ fn test_withdraw_block_based() { ); // we assert that pending rewards did not change - suite.assert_pending_rewards(ADDR1, 1, 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333 + 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333 + 2_500_000); // user 1 can claim their rewards - suite.claim_rewards(ADDR1, 1); - // suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_native_balance(ADDR1, DENOM, 11_666_666); + suite.claim_rewards(MEMBER1, 1); + // suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 11_666_666); // user 3 can unstake and claim their rewards - suite.unstake_native_tokens(ADDR3, 50); + suite.unstake_native_tokens(MEMBER3, 50); suite.skip_blocks(100_000); - suite.assert_native_balance(ADDR3, DENOM, 50); - suite.claim_rewards(ADDR3, 1); - // suite.assert_pending_rewards(ADDR3, 1, 0); - suite.assert_native_balance(ADDR3, DENOM, 3_333_333 + 2_500_000 + 50); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 50); + suite.claim_rewards(MEMBER3, 1); + // suite.assert_pending_rewards(MEMBER3, 1, 0); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 3_333_333 + 2_500_000 + 50); // TODO: fix this rug of 1 udenom by the distribution contract - suite.assert_native_balance(&distribution_contract, DENOM, 1); + suite.assert_native_balance(&distribution_contract, GOV_DENOM, 1); } #[test] @@ -1531,7 +1534,7 @@ fn test_withdraw_time_based() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: true, @@ -1541,30 +1544,30 @@ fn test_withdraw_time_based() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // user 1 and 2 claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); // user 2 unstakes - suite.unstake_native_tokens(ADDR2, 50); + suite.unstake_native_tokens(MEMBER2, 50); suite.skip_seconds(100_000); let distribution_contract = suite.distribution_contract.to_string(); let pre_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); - suite.assert_native_balance(suite.owner.clone().unwrap().as_str(), DENOM, 0); + suite.assert_native_balance(OWNER, GOV_DENOM, 0); suite.withdraw(1); let post_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); - let post_withdraw_owner_balance = suite.get_balance_native(suite.owner.clone().unwrap(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); + let post_withdraw_owner_balance = suite.get_balance_native(OWNER, GOV_DENOM); // after withdraw the balance of the owner should be the same // as pre-withdraw-distributor-bal minus post-withdraw-distributor-bal @@ -1586,25 +1589,25 @@ fn test_withdraw_time_based() { ); // we assert that pending rewards did not change - suite.assert_pending_rewards(ADDR1, 1, 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 0); - suite.assert_pending_rewards(ADDR3, 1, 3_333_333 + 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 0); + suite.assert_pending_rewards(MEMBER3, 1, 3_333_333 + 2_500_000); // user 1 can claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_pending_rewards(ADDR1, 1, 0); - suite.assert_native_balance(ADDR1, DENOM, 11_666_666); + suite.claim_rewards(MEMBER1, 1); + suite.assert_pending_rewards(MEMBER1, 1, 0); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 11_666_666); // user 3 can unstake and claim their rewards - suite.unstake_native_tokens(ADDR3, 50); + suite.unstake_native_tokens(MEMBER3, 50); suite.skip_seconds(100_000); - suite.assert_native_balance(ADDR3, DENOM, 50); - suite.claim_rewards(ADDR3, 1); - suite.assert_pending_rewards(ADDR3, 1, 0); - suite.assert_native_balance(ADDR3, DENOM, 3_333_333 + 2_500_000 + 50); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 50); + suite.claim_rewards(MEMBER3, 1); + suite.assert_pending_rewards(MEMBER3, 1, 0); + suite.assert_native_balance(MEMBER3, GOV_DENOM, 3_333_333 + 2_500_000 + 50); // TODO: fix this rug of 1 udenom by the distribution contract - suite.assert_native_balance(&distribution_contract, DENOM, 1); + suite.assert_native_balance(&distribution_contract, GOV_DENOM, 1); } #[test] @@ -1612,7 +1615,7 @@ fn test_withdraw_and_restart_with_continuous() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: true, @@ -1622,14 +1625,14 @@ fn test_withdraw_and_restart_with_continuous() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // users claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); // skip 1/10th of the time suite.skip_seconds(100_000); @@ -1637,14 +1640,14 @@ fn test_withdraw_and_restart_with_continuous() { let distribution_contract = suite.distribution_contract.to_string(); let pre_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); - suite.assert_native_balance(suite.owner.clone().unwrap().as_str(), DENOM, 0); + suite.assert_native_balance(OWNER, GOV_DENOM, 0); suite.withdraw(1); let post_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); - let post_withdraw_owner_balance = suite.get_balance_native(suite.owner.clone().unwrap(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); + let post_withdraw_owner_balance = suite.get_balance_native(OWNER, GOV_DENOM); // after withdraw the balance of the owner should be the same // as pre-withdraw-distributor-bal minus post-withdraw-distributor-bal @@ -1667,22 +1670,22 @@ fn test_withdraw_and_restart_with_continuous() { ); // we assert that pending rewards did not change - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); // fund again - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // check that pending rewards did not restart. since we skipped 1/10th the // time after the withdraw occurred, everyone should already have 10% of the // new amount pending. - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); } #[test] @@ -1690,7 +1693,7 @@ fn test_withdraw_and_restart_not_continuous() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: false, @@ -1700,14 +1703,14 @@ fn test_withdraw_and_restart_not_continuous() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // users claim their rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); // skip 1/10th of the time suite.skip_seconds(100_000); @@ -1715,14 +1718,14 @@ fn test_withdraw_and_restart_not_continuous() { let distribution_contract = suite.distribution_contract.to_string(); let pre_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); - suite.assert_native_balance(suite.owner.clone().unwrap().as_str(), DENOM, 0); + suite.assert_native_balance(OWNER, GOV_DENOM, 0); suite.withdraw(1); let post_withdraw_distributor_balance = - suite.get_balance_native(distribution_contract.clone(), DENOM); - let post_withdraw_owner_balance = suite.get_balance_native(suite.owner.clone().unwrap(), DENOM); + suite.get_balance_native(distribution_contract.clone(), GOV_DENOM); + let post_withdraw_owner_balance = suite.get_balance_native(OWNER, GOV_DENOM); // after withdraw the balance of the owner should be the same // as pre-withdraw-distributor-bal minus post-withdraw-distributor-bal @@ -1745,15 +1748,15 @@ fn test_withdraw_and_restart_not_continuous() { ); // we assert that pending rewards did not change - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); // fund again - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // skip 1/10th of the time suite.skip_seconds(100_000); @@ -1761,9 +1764,9 @@ fn test_withdraw_and_restart_not_continuous() { // check that pending rewards restarted from the funding date. since we // skipped 1/10th the time after the funding occurred, everyone should // have 10% of the new amount pending - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); } #[test] @@ -1775,10 +1778,10 @@ fn test_withdraw_unauthorized() { suite.skip_blocks(100_000); suite + .base .app - .borrow_mut() .execute_contract( - Addr::unchecked(ADDR1), + Addr::unchecked(MEMBER1), suite.distribution_contract.clone(), &ExecuteMsg::Withdraw { id: 1 }, &[], @@ -1803,7 +1806,7 @@ fn test_claim_404() { suite.skip_blocks(100_000); - suite.claim_rewards(ADDR1, 3); + suite.claim_rewards(MEMBER1, 3); } #[test] @@ -1813,8 +1816,8 @@ fn test_fund_latest_404() { // make new rewards contract let reward_addr = suite + .base .app - .borrow_mut() .instantiate_contract( suite.reward_code_id, Addr::unchecked(OWNER), @@ -1828,15 +1831,15 @@ fn test_fund_latest_404() { .unwrap(); // try to fund latest before creating a distribution - suite.mint_native(coin(100_000_000, DENOM), OWNER); + suite.mint_native(coin(100_000_000, GOV_DENOM), OWNER); suite + .base .app - .borrow_mut() .execute_contract( Addr::unchecked(OWNER), reward_addr, &ExecuteMsg::FundLatest {}, - &[coin(100_000_000, DENOM)], + &[coin(100_000_000, GOV_DENOM)], ) .unwrap(); } @@ -1867,8 +1870,8 @@ fn test_fund_invalid_native_denom() { suite.mint_native(coin(100_000_000, ALT_DENOM), OWNER); suite + .base .app - .borrow_mut() .execute_contract( Addr::unchecked(OWNER), suite.distribution_contract.clone(), @@ -1883,7 +1886,7 @@ fn test_fund_native_block_based_post_expiration_not_continuous() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Height(10), destination: None, continuous: false, @@ -1901,22 +1904,22 @@ fn test_fund_native_block_based_post_expiration_not_continuous() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); - // ADDR2 unstake their stake - suite.unstake_native_tokens(ADDR2, 50); + // MEMBER2 unstake their stake + suite.unstake_native_tokens(MEMBER2, 50); // addr3 claims their rewards - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER3, 1); // skip to 100_000 blocks past the expiration suite.skip_blocks(1_000_000); - suite.assert_pending_rewards(ADDR1, 1, 65_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 30_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 65_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 30_000_000); suite.assert_ends_at(expiration_date); suite.assert_started_at(started_at); @@ -1924,9 +1927,9 @@ fn test_fund_native_block_based_post_expiration_not_continuous() { // we fund the distributor with the same amount of coins as // during setup, meaning that the rewards distribution duration // should be the same. - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); - let current_block = suite.app.block_info(); + let current_block = suite.base.app.block_info(); // funding after the reward period had expired should // reset the start date to that of the funding. @@ -1943,7 +1946,7 @@ fn test_fund_cw20_time_based_post_expiration_not_continuous() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Cw20(DENOM.to_string()), + denom: UncheckedDenom::Cw20(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: false, @@ -1963,23 +1966,23 @@ fn test_fund_cw20_time_based_post_expiration_not_continuous() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); - // ADDR2 unstake their stake - suite.unstake_cw20_tokens(50, ADDR2); + // MEMBER2 unstake their stake + suite.unstake_cw20_tokens(50, MEMBER2); // addr3 claims their rewards - suite.claim_rewards(ADDR3, 1); - suite.assert_cw20_balance(cw20_denom, ADDR3, 2_500_000); + suite.claim_rewards(MEMBER3, 1); + suite.assert_cw20_balance(cw20_denom, MEMBER3, 2_500_000); // skip to 100_000 blocks past the expiration suite.skip_seconds(1_000_000); - suite.assert_pending_rewards(ADDR1, 1, 65_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 30_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 65_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 30_000_000); suite.assert_ends_at(expiration_date); suite.assert_started_at(started_at); @@ -1994,7 +1997,7 @@ fn test_fund_cw20_time_based_post_expiration_not_continuous() { suite.fund_cw20(1, funding_denom.clone()); - let current_block = suite.app.block_info(); + let current_block = suite.base.app.block_info(); // funding after the reward period had expired should // reset the start date to that of the funding. @@ -2013,7 +2016,7 @@ fn test_fund_cw20_time_based_pre_expiration() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Cw20(DENOM.to_string()), + denom: UncheckedDenom::Cw20(GOV_DENOM.to_string()), duration: Duration::Time(10), destination: None, continuous: true, @@ -2031,22 +2034,22 @@ fn test_fund_cw20_time_based_pre_expiration() { // skip 1/10th of the time suite.skip_seconds(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); - // ADDR2 unstake their stake - suite.unstake_cw20_tokens(50, ADDR2); + // MEMBER2 unstake their stake + suite.unstake_cw20_tokens(50, MEMBER2); // addr3 claims their rewards - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER3, 1); // skip to 100_000 blocks before the expiration suite.skip_seconds(800_000); - suite.assert_pending_rewards(ADDR1, 1, 58_333_333); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 26_666_666); + suite.assert_pending_rewards(MEMBER1, 1, 58_333_333); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 26_666_666); suite.assert_ends_at(expiration_date); suite.assert_started_at(started_at); @@ -2087,22 +2090,22 @@ fn test_fund_native_height_based_pre_expiration() { // skip 1/10th of the time suite.skip_blocks(100_000); - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); - // ADDR2 unstake their stake - suite.unstake_native_tokens(ADDR2, 50); + // MEMBER2 unstake their stake + suite.unstake_native_tokens(MEMBER2, 50); // addr3 claims their rewards - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER3, 1); // skip to 100_000 blocks before the expiration suite.skip_blocks(800_000); - suite.assert_pending_rewards(ADDR1, 1, 58_333_333); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 26_666_666); + suite.assert_pending_rewards(MEMBER1, 1, 58_333_333); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 26_666_666); suite.assert_ends_at(expiration_date); suite.assert_started_at(started_at); @@ -2110,7 +2113,7 @@ fn test_fund_native_height_based_pre_expiration() { // we fund the distributor with the same amount of coins as // during setup, meaning that the rewards distribution duration // should be the same. - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // funding before the reward period expires should // not reset the existing rewards cycle @@ -2127,7 +2130,7 @@ fn test_native_dao_rewards_entry_edge_case() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); // we start with the following staking power split: - // [ADDR1: 100, ADDR2: 50, ADDR3: 50], or [ADDR1: 50%, ADDR2: 25%, ADDR3: 25% + // [MEMBER1: 100, MEMBER2: 50, MEMBER3: 50], or [MEMBER1: 50%, MEMBER2: 25%, MEMBER3: 25% suite.assert_amount(1_000); suite.assert_ends_at(Expiration::AtHeight(1_000_000)); suite.assert_duration(10); @@ -2135,63 +2138,63 @@ fn test_native_dao_rewards_entry_edge_case() { // skip 1/10th of the time suite.skip_blocks(100_000); - // ADDR1 stakes additional 100 tokens, bringing the new staking power split to - // [ADDR1: 200, ADDR2: 50, ADDR3: 50], or [ADDR1: 66.6%, ADDR2: 16.6%, ADDR3: 16.6%] - // this means that per 100_000 blocks, ADDR1 should receive 6_666_666, while - // ADDR2 and ADDR3 should receive 1_666_666 each. - suite.mint_native(coin(100, DENOM), ADDR1); - suite.stake_native_tokens(ADDR1, 100); + // MEMBER1 stakes additional 100 tokens, bringing the new staking power split to + // [MEMBER1: 200, MEMBER2: 50, MEMBER3: 50], or [MEMBER1: 66.6%, MEMBER2: 16.6%, MEMBER3: 16.6%] + // this means that per 100_000 blocks, MEMBER1 should receive 6_666_666, while + // MEMBER2 and MEMBER3 should receive 1_666_666 each. + suite.mint_native(coin(100, GOV_DENOM), MEMBER1); + suite.stake_native_tokens(MEMBER1, 100); // rewards here should not be affected by the new stake, - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip 1/10th of the time suite.skip_blocks(100_000); // here we should see the new stake affecting the rewards split. - suite.assert_pending_rewards(ADDR1, 1, 5_000_000 + 6_666_666); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000 + 1_666_666); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000 + 6_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000 + 1_666_666); - // ADDR1 claims rewards - suite.claim_rewards(ADDR1, 1); - suite.assert_native_balance(ADDR1, DENOM, 5_000_000 + 6_666_666); - suite.assert_pending_rewards(ADDR1, 1, 0); + // MEMBER1 claims rewards + suite.claim_rewards(MEMBER1, 1); + suite.assert_native_balance(MEMBER1, GOV_DENOM, 5_000_000 + 6_666_666); + suite.assert_pending_rewards(MEMBER1, 1, 0); - // ADDR2 and ADDR3 unstake their stake - // new voting power split is [ADDR1: 100%, ADDR2: 0%, ADDR3: 0%] - suite.unstake_native_tokens(ADDR2, 50); - suite.unstake_native_tokens(ADDR3, 50); + // MEMBER2 and MEMBER3 unstake their stake + // new voting power split is [MEMBER1: 100%, MEMBER2: 0%, MEMBER3: 0%] + suite.unstake_native_tokens(MEMBER2, 50); + suite.unstake_native_tokens(MEMBER3, 50); - // we assert that by unstaking, ADDR2 and ADDR3 do not forfeit their earned but unclaimed rewards - suite.assert_pending_rewards(ADDR2, 1, 2_500_000 + 1_666_666); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000 + 1_666_666); + // we assert that by unstaking, MEMBER2 and MEMBER3 do not forfeit their earned but unclaimed rewards + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000 + 1_666_666); // skip a block and assert that nothing changes suite.skip_blocks(1); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000 + 1_666_666); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000 + 1_666_666); // skip the remaining blocks to reach 1/10th of the time suite.skip_blocks(99_999); - // because ADDR2 and ADDR3 are not staking, ADDR1 receives all the rewards. - // ADDR2 and ADDR3 should have the same amount of pending rewards as before. - suite.assert_pending_rewards(ADDR1, 1, 10_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000 + 1_666_666); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000 + 1_666_666); + // because MEMBER2 and MEMBER3 are not staking, MEMBER1 receives all the rewards. + // MEMBER2 and MEMBER3 should have the same amount of pending rewards as before. + suite.assert_pending_rewards(MEMBER1, 1, 10_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000 + 1_666_666); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000 + 1_666_666); - // ADDR2 and ADDR3 wake up, claim and restake their rewards - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + // MEMBER2 and MEMBER3 wake up, claim and restake their rewards + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); - let addr1_balance = suite.get_balance_native(ADDR1, DENOM); - let addr2_balance = suite.get_balance_native(ADDR2, DENOM); + let addr1_balance = suite.get_balance_native(MEMBER1, GOV_DENOM); + let addr2_balance = suite.get_balance_native(MEMBER2, GOV_DENOM); - suite.stake_native_tokens(ADDR1, addr1_balance); - suite.stake_native_tokens(ADDR2, addr2_balance); + suite.stake_native_tokens(MEMBER1, addr1_balance); + suite.stake_native_tokens(MEMBER2, addr2_balance); } #[test] @@ -2233,20 +2236,20 @@ fn test_fund_native_on_create() { suite.skip_blocks(1_000_000); // skip 1/10th of the time - suite.assert_pending_rewards(ADDR1, 2, 5_000_000); - suite.assert_pending_rewards(ADDR2, 2, 2_500_000); - suite.assert_pending_rewards(ADDR3, 2, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 2, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 2, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 2, 2_500_000); } #[test] -#[should_panic(expected = "Must send reserve token 'ujuno'")] +#[should_panic(expected = "Must send reserve token 'ugovtoken'")] fn test_fund_native_with_other_denom() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); suite.mint_native(coin(100, ALT_DENOM), OWNER); let execute_create_msg = ExecuteMsg::Create(CreateMsg { - denom: cw20::UncheckedDenom::Native(DENOM.to_string()), + denom: cw20::UncheckedDenom::Native(GOV_DENOM.to_string()), emission_rate: EmissionRate::Linear { amount: Uint128::new(1000), duration: Duration::Height(100), @@ -2260,6 +2263,7 @@ fn test_fund_native_with_other_denom() { // create distribution with other denom provided suite + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -2275,11 +2279,11 @@ fn test_fund_native_with_other_denom() { fn test_fund_native_multiple_denoms() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); - suite.mint_native(coin(100, DENOM), OWNER); + suite.mint_native(coin(100, GOV_DENOM), OWNER); suite.mint_native(coin(100, ALT_DENOM), OWNER); let execute_create_msg = ExecuteMsg::Create(CreateMsg { - denom: cw20::UncheckedDenom::Native(DENOM.to_string()), + denom: cw20::UncheckedDenom::Native(GOV_DENOM.to_string()), emission_rate: EmissionRate::Linear { amount: Uint128::new(1000), duration: Duration::Height(100), @@ -2293,12 +2297,13 @@ fn test_fund_native_multiple_denoms() { // create distribution with 0 amount suite + .base .app .execute_contract( Addr::unchecked(OWNER), suite.distribution_contract.clone(), &execute_create_msg, - &[coin(100, DENOM), coin(100, ALT_DENOM)], + &[coin(100, GOV_DENOM), coin(100, ALT_DENOM)], ) .unwrap(); } @@ -2308,7 +2313,7 @@ fn test_fund_native_multiple_denoms() { fn test_fund_native_on_create_cw20() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); - suite.mint_native(coin(100, DENOM), OWNER); + suite.mint_native(coin(100, GOV_DENOM), OWNER); let cw20_denom = suite .mint_cw20( @@ -2335,12 +2340,13 @@ fn test_fund_native_on_create_cw20() { // create cw20 distribution with native funds provided suite + .base .app .execute_contract( Addr::unchecked(OWNER), suite.distribution_contract.clone(), &execute_create_msg, - &coins(100, DENOM), + &coins(100, GOV_DENOM), ) .unwrap(); } @@ -2381,7 +2387,7 @@ fn test_update_owner() { fn test_update_vp_contract() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); - let new_vp_contract = setup_native_token_test(suite.app.borrow_mut()); + let new_vp_contract = suite.base.cw4().dao().voting_module_addr; suite.update_vp_contract(1, new_vp_contract.as_str()); @@ -2462,7 +2468,7 @@ fn test_rewards_not_lost_after_discontinuous_restart() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 3_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Height(1), destination: None, continuous: false, @@ -2477,17 +2483,17 @@ fn test_rewards_not_lost_after_discontinuous_restart() { suite.skip_blocks(33_333); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 49999500); - suite.assert_pending_rewards(ADDR2, 1, 24999750); - suite.assert_pending_rewards(ADDR3, 1, 24999750); + suite.assert_pending_rewards(MEMBER1, 1, 49999500); + suite.assert_pending_rewards(MEMBER2, 1, 24999750); + suite.assert_pending_rewards(MEMBER3, 1, 24999750); // before user claim rewards, someone funded - suite.fund_native(1, coin(1u128, DENOM)); + suite.fund_native(1, coin(1u128, GOV_DENOM)); // pending rewards should still exist - suite.assert_pending_rewards(ADDR1, 1, 49999500); - suite.assert_pending_rewards(ADDR2, 1, 24999750); - suite.assert_pending_rewards(ADDR3, 1, 24999750); + suite.assert_pending_rewards(MEMBER1, 1, 49999500); + suite.assert_pending_rewards(MEMBER2, 1, 24999750); + suite.assert_pending_rewards(MEMBER3, 1, 24999750); } #[test] @@ -2502,20 +2508,20 @@ fn test_fund_while_paused() { suite.skip_blocks(100_000); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // pause suite.pause_emission(1); // pending rewards should still exist - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // fund during pause the amount that's already been distributed - suite.fund_native(1, coin(10_000_000, DENOM)); + suite.fund_native(1, coin(10_000_000, GOV_DENOM)); // restart suite.update_emission_rate(1, Duration::Height(10), 1_000, true); @@ -2527,13 +2533,13 @@ fn test_fund_while_paused() { suite.skip_blocks(100_000); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 2 * 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2 * 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2 * 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 2 * 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2 * 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2 * 2_500_000); // pause and fund more suite.pause_emission(1); - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // restart suite.update_emission_rate(1, Duration::Height(10), 1_000, true); @@ -2555,9 +2561,9 @@ fn test_pause_expired() { suite.skip_blocks(100_000); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // check undistributed rewards suite.assert_undistributed_rewards(1, 90_000_000); @@ -2572,9 +2578,9 @@ fn test_pause_expired() { suite.update_emission_rate(1, Duration::Height(10), 1_000, false); // check pending rewards are the same - suite.assert_pending_rewards(ADDR1, 1, 5_000_000); - suite.assert_pending_rewards(ADDR2, 1, 2_500_000); - suite.assert_pending_rewards(ADDR3, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER1, 1, 5_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 2_500_000); + suite.assert_pending_rewards(MEMBER3, 1, 2_500_000); // skip all and more, expiring suite.skip_blocks(1_100_000); @@ -2583,9 +2589,9 @@ fn test_pause_expired() { suite.assert_undistributed_rewards(1, 0); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 50_000_000); - suite.assert_pending_rewards(ADDR2, 1, 25_000_000); - suite.assert_pending_rewards(ADDR3, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 25_000_000); // pause suite.pause_emission(1); @@ -2594,12 +2600,12 @@ fn test_pause_expired() { suite.assert_undistributed_rewards(1, 0); // pending rewards should still exist - suite.assert_pending_rewards(ADDR1, 1, 50_000_000); - suite.assert_pending_rewards(ADDR2, 1, 25_000_000); - suite.assert_pending_rewards(ADDR3, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 25_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 25_000_000); // fund - suite.fund_native(1, coin(100_000_000, DENOM)); + suite.fund_native(1, coin(100_000_000, GOV_DENOM)); // resume suite.update_emission_rate(1, Duration::Height(10), 1_000, false); @@ -2614,9 +2620,9 @@ fn test_pause_expired() { suite.assert_undistributed_rewards(1, 0); // check pending rewards - suite.assert_pending_rewards(ADDR1, 1, 100_000_000); - suite.assert_pending_rewards(ADDR2, 1, 50_000_000); - suite.assert_pending_rewards(ADDR3, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 50_000_000); } #[test] @@ -2624,7 +2630,7 @@ fn test_large_stake_before_claim() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) .with_rewards_config(RewardsConfig { amount: 3_000, - denom: UncheckedDenom::Native(DENOM.to_string()), + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), duration: Duration::Height(1), destination: None, continuous: true, @@ -2635,22 +2641,22 @@ fn test_large_stake_before_claim() { suite.assert_ends_at(Expiration::AtHeight(33_333)); suite.assert_duration(1); - // ADDR1 stake big amount of tokens + // MEMBER1 stake big amount of tokens suite.skip_blocks(33_000); - suite.mint_native(coin(10_000, &suite.reward_denom), ADDR1); - suite.stake_native_tokens(ADDR1, 10_000); + suite.mint_native(coin(10_000, &suite.reward_denom), MEMBER1); + suite.stake_native_tokens(MEMBER1, 10_000); // ADD1 claims rewards in the next block suite.skip_blocks(1); - suite.claim_rewards(ADDR1, 1); + suite.claim_rewards(MEMBER1, 1); // skip to end suite.skip_blocks(100_000_000); // all users should be able to claim rewards - suite.claim_rewards(ADDR1, 1); - suite.claim_rewards(ADDR2, 1); - suite.claim_rewards(ADDR3, 1); + suite.claim_rewards(MEMBER1, 1); + suite.claim_rewards(MEMBER2, 1); + suite.claim_rewards(MEMBER3, 1); } #[test] @@ -2662,14 +2668,14 @@ fn test_fund_latest_native() { suite.assert_duration(10); // double duration by 1_000_000 blocks - suite.fund_latest_native(coin(100_000_000, DENOM)); + suite.fund_latest_native(coin(100_000_000, GOV_DENOM)); // skip all of the time suite.skip_blocks(2_000_000); - suite.assert_pending_rewards(ADDR1, 1, 100_000_000); - suite.assert_pending_rewards(ADDR2, 1, 50_000_000); - suite.assert_pending_rewards(ADDR3, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 50_000_000); } #[test] @@ -2677,7 +2683,7 @@ fn test_fund_latest_cw20() { let mut suite = SuiteBuilder::base(super::suite::DaoType::CW20) .with_rewards_config(RewardsConfig { amount: 1_000, - denom: UncheckedDenom::Cw20(DENOM.to_string()), + denom: UncheckedDenom::Cw20(GOV_DENOM.to_string()), duration: Duration::Height(10), destination: None, continuous: true, @@ -2697,9 +2703,9 @@ fn test_fund_latest_cw20() { // skip all of the time suite.skip_blocks(2_000_000); - suite.assert_pending_rewards(ADDR1, 1, 100_000_000); - suite.assert_pending_rewards(ADDR2, 1, 50_000_000); - suite.assert_pending_rewards(ADDR3, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER1, 1, 100_000_000); + suite.assert_pending_rewards(MEMBER2, 1, 50_000_000); + suite.assert_pending_rewards(MEMBER3, 1, 50_000_000); } #[test] @@ -2715,7 +2721,7 @@ fn test_fund_latest_cw20_invalid_native() { }) .build(); - suite.fund_latest_native(coin(100, DENOM)); + suite.fund_latest_native(coin(100, GOV_DENOM)); } #[test] @@ -2761,6 +2767,7 @@ fn test_closed_funding() { // create distribution suite + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -2778,12 +2785,12 @@ fn test_closed_funding() { ); // test fund from non-owner - suite.mint_native(coin(100, ALT_DENOM), ADDR1); + suite.mint_native(coin(100, ALT_DENOM), MEMBER1); let err: ContractError = suite + .base .app - .borrow_mut() .execute_contract( - Addr::unchecked(ADDR1), + Addr::unchecked(MEMBER1), suite.distribution_contract.clone(), &ExecuteMsg::Fund(FundMsg { id: 2 }), &[coin(100, ALT_DENOM)], @@ -2798,9 +2805,10 @@ fn test_closed_funding() { // test fund from non-owner suite + .base .app .execute_contract( - Addr::unchecked(ADDR1), + Addr::unchecked(MEMBER1), suite.distribution_contract.clone(), &ExecuteMsg::Fund(FundMsg { id: 2 }), &[coin(100, ALT_DENOM)], @@ -2837,6 +2845,7 @@ fn test_queries_before_funded() { // create distribution with no funds suite + .base .app .execute_contract( Addr::unchecked(OWNER), @@ -2847,9 +2856,9 @@ fn test_queries_before_funded() { .unwrap(); // users have no rewards - suite.assert_pending_rewards(ADDR1, 2, 0); - suite.assert_pending_rewards(ADDR2, 2, 0); - suite.assert_pending_rewards(ADDR3, 2, 0); + suite.assert_pending_rewards(MEMBER1, 2, 0); + suite.assert_pending_rewards(MEMBER2, 2, 0); + suite.assert_pending_rewards(MEMBER3, 2, 0); // ensure undistributed rewards are immediately 0 suite.assert_undistributed_rewards(2, 0); @@ -2862,11 +2871,11 @@ fn test_migrate() { cw2::set_contract_version(&mut deps.storage, "test", "0.0.1").unwrap(); // wrong contract name errors - let err: ContractError = + let err: crate::ContractError = crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( err, - ContractError::MigrationErrorIncorrectContract { + crate::ContractError::MigrationErrorIncorrectContract { expected: CONTRACT_NAME.to_string(), actual: "test".to_string(), } @@ -2877,11 +2886,11 @@ fn test_migrate() { crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap(); // same-version migration errors - let err: ContractError = + let err: crate::ContractError = crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( err, - ContractError::MigrationErrorInvalidVersion { + crate::ContractError::MigrationErrorInvalidVersion { new: CONTRACT_VERSION.to_string(), current: CONTRACT_VERSION.to_string(), } @@ -2889,11 +2898,11 @@ fn test_migrate() { // future version errors cw2::set_contract_version(&mut deps.storage, CONTRACT_NAME, "9.9.9").unwrap(); - let err: ContractError = + let err: crate::ContractError = crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( err, - ContractError::MigrationErrorInvalidVersion { + crate::ContractError::MigrationErrorInvalidVersion { new: CONTRACT_VERSION.to_string(), current: "9.9.9".to_string(), } diff --git a/contracts/external/btsg-ft-factory/src/testing/mod.rs b/contracts/external/btsg-ft-factory/src/testing/mod.rs index 2282ac98d..53e84f356 100644 --- a/contracts/external/btsg-ft-factory/src/testing/mod.rs +++ b/contracts/external/btsg-ft-factory/src/testing/mod.rs @@ -3,26 +3,15 @@ mod bitsong_stargate; mod tests; use app::BitsongApp; -use cosmwasm_std::{Addr, Empty}; -use cw_multi_test::{Contract, ContractWrapper, Executor}; -use dao_testing::contracts::native_staked_balances_voting_contract; +use cosmwasm_std::Addr; +use cw_multi_test::Executor; +use dao_testing::contracts::{btsg_ft_factory_contract, dao_voting_token_staked_contract}; use crate::msg::InstantiateMsg; /// Address used to stake stuff. pub(crate) const STAKER: &str = "staker"; -pub(crate) fn btsg_ft_factory_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - pub(crate) struct CommonTest { app: BitsongApp, module_id: u64, @@ -32,7 +21,7 @@ pub(crate) struct CommonTest { pub(crate) fn setup_test() -> CommonTest { let mut app = BitsongApp::new(); let factory_id = app.store_code(btsg_ft_factory_contract()); - let module_id = app.store_code(native_staked_balances_voting_contract()); + let module_id = app.store_code(dao_voting_token_staked_contract()); let factory = app .instantiate_contract( diff --git a/contracts/external/btsg-ft-factory/src/testing/tests.rs b/contracts/external/btsg-ft-factory/src/testing/tests.rs index 21cb4f58a..02d456659 100644 --- a/contracts/external/btsg-ft-factory/src/testing/tests.rs +++ b/contracts/external/btsg-ft-factory/src/testing/tests.rs @@ -9,7 +9,7 @@ use dao_interface::{ state::{Admin, ModuleInstantiateInfo}, token::InitialBalance, }; -use dao_testing::contracts::{dao_dao_contract, proposal_single_contract}; +use dao_testing::contracts::{dao_dao_core_contract, dao_proposal_single_contract}; use crate::{ bitsong::{Coin, MsgMint, MsgSetUri}, @@ -30,8 +30,8 @@ fn test_issue_fantoken() -> anyhow::Result<()> { .. } = setup_test(); - let core_id = app.store_code(dao_dao_contract()); - let proposal_single_id = app.store_code(proposal_single_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let proposal_single_id = app.store_code(dao_proposal_single_contract()); let initial_balances = vec![InitialBalance { amount: Uint128::new(100), @@ -132,8 +132,8 @@ fn test_initial_fantoken_balances() -> anyhow::Result<()> { .. } = setup_test(); - let core_id = app.store_code(dao_dao_contract()); - let proposal_single_id = app.store_code(proposal_single_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let proposal_single_id = app.store_code(dao_proposal_single_contract()); let initial_balances = vec![InitialBalance { amount: Uint128::new(100), @@ -239,8 +239,8 @@ fn test_fantoken_minter_and_authority_set_to_dao() -> anyhow::Result<()> { .. } = setup_test(); - let core_id = app.store_code(dao_dao_contract()); - let proposal_single_id = app.store_code(proposal_single_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let proposal_single_id = app.store_code(dao_proposal_single_contract()); let initial_balances = vec![InitialBalance { amount: Uint128::new(100), @@ -396,8 +396,8 @@ fn test_fantoken_can_be_staked() -> anyhow::Result<()> { .. } = setup_test(); - let core_id = app.store_code(dao_dao_contract()); - let proposal_single_id = app.store_code(proposal_single_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let proposal_single_id = app.store_code(dao_proposal_single_contract()); let initial_balances = vec![InitialBalance { amount: Uint128::new(100), diff --git a/contracts/external/cw-admin-factory/Cargo.toml b/contracts/external/cw-admin-factory/Cargo.toml index 394f859fb..4b268d4b6 100644 --- a/contracts/external/cw-admin-factory/Cargo.toml +++ b/contracts/external/cw-admin-factory/Cargo.toml @@ -30,13 +30,12 @@ thiserror = { workspace = true } cw-utils = { workspace = true } [dev-dependencies] +cw-admin-factory = { workspace = true } bech32 = { workspace = true } cosmwasm-schema = { workspace = true } -cw-admin-factory = { workspace = true } cw-multi-test = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true } cw4 = { workspace = true } -dao-dao-core = { workspace = true, features = ["library"] } dao-interface = { workspace = true } dao-proposal-single = { workspace = true } dao-testing = { workspace = true } diff --git a/contracts/external/cw-admin-factory/src/tests.rs b/contracts/external/cw-admin-factory/src/tests.rs index 7e6dbfbed..45b009979 100644 --- a/contracts/external/cw-admin-factory/src/tests.rs +++ b/contracts/external/cw-admin-factory/src/tests.rs @@ -2,57 +2,29 @@ use std::vec; use cosmwasm_std::{ testing::{mock_dependencies, mock_env, mock_info}, - to_json_binary, Addr, Binary, Empty, Reply, SubMsg, SubMsgResponse, SubMsgResult, WasmMsg, + to_json_binary, Addr, Binary, Reply, SubMsg, SubMsgResponse, SubMsgResult, WasmMsg, }; - -use cw_multi_test::{App, AppResponse, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, AppResponse, Executor}; use dao_interface::state::{Admin, ModuleInstantiateInfo}; +use dao_testing::contracts::{ + cw20_base_contract, cw_admin_factory_contract, dao_dao_core_contract, +}; use crate::{ contract::{ instantiate, migrate, reply, CONTRACT_NAME, CONTRACT_VERSION, INSTANTIATE_CONTRACT_REPLY_ID, }, msg::{AdminResponse, ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}, - ContractError, }; +use cw_admin_factory::ContractError; const ADMIN_ADDR: &str = "admin"; -fn factory_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply); - Box::new(contract) -} - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn cw_core_contract() -> Box> { - let contract = ContractWrapper::new( - dao_dao_core::contract::execute, - dao_dao_core::contract::instantiate, - dao_dao_core::contract::query, - ) - .with_reply(dao_dao_core::contract::reply) - .with_migrate(dao_dao_core::contract::migrate); - Box::new(contract) -} - #[test] pub fn test_set_self_admin() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); - let cw20_code_id = app.store_code(cw20_contract()); + let code_id = app.store_code(cw_admin_factory_contract()); + let cw20_code_id = app.store_code(cw20_base_contract()); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), @@ -75,7 +47,7 @@ pub fn test_set_self_admin() { .unwrap(); // Instantiate core contract using factory. - let cw_core_code_id = app.store_code(cw_core_contract()); + let cw_core_code_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { dao_uri: None, admin: None, @@ -136,8 +108,8 @@ pub fn test_set_self_admin() { #[test] pub fn test_authorized_set_self_admin() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); - let cw20_code_id = app.store_code(cw20_contract()); + let code_id = app.store_code(cw_admin_factory_contract()); + let cw20_code_id = app.store_code(cw20_base_contract()); let cw20_instantiate = cw20_base::msg::InstantiateMsg { name: "DAO".to_string(), symbol: "DAO".to_string(), @@ -169,7 +141,7 @@ pub fn test_authorized_set_self_admin() { assert_eq!(current_admin.admin, Some(Addr::unchecked(ADMIN_ADDR))); // Instantiate core contract using factory. - let cw_core_code_id = app.store_code(cw_core_contract()); + let cw_core_code_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { dao_uri: None, admin: None, diff --git a/contracts/external/cw-payroll-factory/Cargo.toml b/contracts/external/cw-payroll-factory/Cargo.toml index 9b89969a5..be8010582 100644 --- a/contracts/external/cw-payroll-factory/Cargo.toml +++ b/contracts/external/cw-payroll-factory/Cargo.toml @@ -1,5 +1,5 @@ [package] -name ="cw-payroll-factory" +name = "cw-payroll-factory" authors = ["Jake Hartnell"] description = "A CosmWasm factory contract for instantiating a payroll contract." edition = { workspace = true } @@ -29,6 +29,8 @@ cw-vesting = { workspace = true, features = ["library"] } cw-utils = { workspace = true } [dev-dependencies] +cw-payroll-factory = { workspace = true } cw-multi-test = { workspace = true } cw20-base = { workspace = true, features = ["library"] } +dao-testing = { workspace = true } wynd-utils = { workspace = true } diff --git a/contracts/external/cw-payroll-factory/src/tests.rs b/contracts/external/cw-payroll-factory/src/tests.rs index 1feffd463..a341a9158 100644 --- a/contracts/external/cw-payroll-factory/src/tests.rs +++ b/contracts/external/cw-payroll-factory/src/tests.rs @@ -1,56 +1,31 @@ -use cosmwasm_std::{coins, to_json_binary, Addr, Empty, Uint128}; +use cosmwasm_std::{coins, to_json_binary, Addr, Uint128}; use cw20::{Cw20Coin, Cw20ExecuteMsg}; use cw_denom::UncheckedDenom; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; +use cw_multi_test::{App, BankSudo, Executor, SudoMsg}; use cw_ownable::OwnershipError; use cw_vesting::{ msg::{InstantiateMsg as PayrollInstantiateMsg, QueryMsg as PayrollQueryMsg}, vesting::{Schedule, Status, Vest}, }; +use dao_testing::contracts::{ + cw20_base_contract, cw_payroll_factory_contract, cw_vesting_contract, +}; use crate::{ msg::{ExecuteMsg, InstantiateMsg, QueryMsg, ReceiveMsg}, state::VestingContract, - ContractError, }; +use cw_payroll_factory::ContractError; const ALICE: &str = "alice"; const BOB: &str = "bob"; const INITIAL_BALANCE: u128 = 1000000000; const NATIVE_DENOM: &str = "denom"; -fn factory_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply); - Box::new(contract) -} - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -pub fn cw_vesting_contract() -> Box> { - let contract = ContractWrapper::new( - cw_vesting::contract::execute, - cw_vesting::contract::instantiate, - cw_vesting::contract::query, - ); - Box::new(contract) -} - #[test] pub fn test_instantiate_native_payroll_contract() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); + let code_id = app.store_code(cw_payroll_factory_contract()); let cw_vesting_code_id = app.store_code(cw_vesting_contract()); // Instantiate factory with only Alice allowed to instantiate payroll contracts @@ -211,8 +186,8 @@ pub fn test_instantiate_native_payroll_contract() { #[test] pub fn test_instantiate_cw20_payroll_contract() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); - let cw20_code_id = app.store_code(cw20_contract()); + let code_id = app.store_code(cw_payroll_factory_contract()); + let cw20_code_id = app.store_code(cw20_base_contract()); let cw_vesting_code_id = app.store_code(cw_vesting_contract()); // Instantiate cw20 contract with balances for Alice @@ -343,7 +318,7 @@ pub fn test_instantiate_cw20_payroll_contract() { #[test] fn test_instantiate_wrong_ownership_native() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); + let code_id = app.store_code(cw_payroll_factory_contract()); let cw_vesting_code_id = app.store_code(cw_vesting_contract()); let amount = Uint128::new(1000000); @@ -413,7 +388,7 @@ fn test_instantiate_wrong_ownership_native() { #[test] fn test_update_vesting_code_id() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); + let code_id = app.store_code(cw_payroll_factory_contract()); let cw_vesting_code_id = app.store_code(cw_vesting_contract()); let cw_vesting_code_two = app.store_code(cw_vesting_contract()); @@ -512,8 +487,8 @@ fn test_update_vesting_code_id() { #[test] pub fn test_inconsistent_cw20_amount() { let mut app = App::default(); - let code_id = app.store_code(factory_contract()); - let cw20_code_id = app.store_code(cw20_contract()); + let code_id = app.store_code(cw_payroll_factory_contract()); + let cw20_code_id = app.store_code(cw20_base_contract()); let cw_vesting_code_id = app.store_code(cw_vesting_contract()); // Instantiate cw20 contract with balances for Alice let cw20_addr = app diff --git a/contracts/external/cw-token-swap/Cargo.toml b/contracts/external/cw-token-swap/Cargo.toml index e974d5453..2c879dae8 100644 --- a/contracts/external/cw-token-swap/Cargo.toml +++ b/contracts/external/cw-token-swap/Cargo.toml @@ -26,6 +26,8 @@ cw20 = { workspace = true } thiserror = { workspace = true } [dev-dependencies] +cw-token-swap = { workspace = true } cosmwasm-schema = { workspace = true } cw-multi-test = { workspace = true } cw20-base = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/external/cw-token-swap/src/error.rs b/contracts/external/cw-token-swap/src/error.rs index df3961398..82519383b 100644 --- a/contracts/external/cw-token-swap/src/error.rs +++ b/contracts/external/cw-token-swap/src/error.rs @@ -1,8 +1,7 @@ use cosmwasm_std::{StdError, Uint128}; use thiserror::Error; -#[derive(Error, Debug)] -#[cfg_attr(test, derive(PartialEq))] // Only neeed while testing. +#[derive(Error, Debug, PartialEq)] pub enum ContractError { #[error("{0}")] Std(#[from] StdError), diff --git a/contracts/external/cw-token-swap/src/tests.rs b/contracts/external/cw-token-swap/src/tests.rs index e2d2a9913..fdc475dd6 100644 --- a/contracts/external/cw-token-swap/src/tests.rs +++ b/contracts/external/cw-token-swap/src/tests.rs @@ -1,9 +1,10 @@ use cosmwasm_std::{ testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, Coin, Empty, Uint128, + to_json_binary, Addr, Coin, Uint128, }; use cw20::Cw20Coin; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; +use cw_multi_test::{App, BankSudo, Executor, SudoMsg}; +use dao_testing::contracts::{cw20_base_contract, cw_token_swap_contract}; use crate::{ contract::{migrate, CONTRACT_NAME, CONTRACT_VERSION}, @@ -11,36 +12,18 @@ use crate::{ Counterparty, ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, StatusResponse, TokenInfo, }, state::{CheckedCounterparty, CheckedTokenInfo}, - ContractError, }; +use cw_token_swap::ContractError; const DAO1: &str = "dao1"; const DAO2: &str = "dao2"; -fn escrow_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ); - Box::new(contract) -} - -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - #[test] fn test_simple_escrow() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -140,8 +123,8 @@ fn test_simple_escrow() { fn test_withdraw() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -324,8 +307,8 @@ fn test_withdraw() { fn test_withdraw_post_completion() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -432,8 +415,8 @@ fn test_withdraw_post_completion() { fn test_invalid_instantiate() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -523,7 +506,7 @@ fn test_invalid_instantiate() { fn test_non_distincy_counterparties() { let mut app = App::default(); - let escrow_code = app.store_code(escrow_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); // Zero amount not allowed for native tokens. let err: ContractError = app @@ -561,8 +544,8 @@ fn test_non_distincy_counterparties() { fn test_fund_non_counterparty() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -658,8 +641,8 @@ fn test_fund_non_counterparty() { fn test_fund_twice() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -778,8 +761,8 @@ fn test_fund_twice() { fn test_fund_invalid_amount() { let mut app = App::default(); - let cw20_code = app.store_code(cw20_contract()); - let escrow_code = app.store_code(escrow_contract()); + let cw20_code = app.store_code(cw20_base_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let cw20 = app .instantiate_contract( @@ -883,7 +866,7 @@ fn test_fund_invalid_amount() { fn test_fund_invalid_denom() { let mut app = App::default(); - let escrow_code = app.store_code(escrow_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); let escrow = app .instantiate_contract( @@ -943,8 +926,8 @@ fn test_fund_invalid_denom() { fn test_fund_invalid_cw20() { let mut app = App::default(); - let escrow_code = app.store_code(escrow_contract()); - let cw20_code = app.store_code(cw20_contract()); + let escrow_code = app.store_code(cw_token_swap_contract()); + let cw20_code = app.store_code(cw20_base_contract()); let cw20 = app .instantiate_contract( diff --git a/contracts/external/cw-vesting/Cargo.toml b/contracts/external/cw-vesting/Cargo.toml index 2689de7de..1d9829424 100644 --- a/contracts/external/cw-vesting/Cargo.toml +++ b/contracts/external/cw-vesting/Cargo.toml @@ -36,6 +36,7 @@ thiserror = { workspace = true } wynd-utils = { workspace = true } [dev-dependencies] +cw-vesting = { workspace = true } anyhow = { workspace = true } cw-multi-test = { workspace = true } cw20-base = { workspace = true } diff --git a/contracts/external/cw-vesting/src/tests.rs b/contracts/external/cw-vesting/src/tests.rs index 9a55807b5..9bbaa30d4 100644 --- a/contracts/external/cw-vesting/src/tests.rs +++ b/contracts/external/cw-vesting/src/tests.rs @@ -1,12 +1,10 @@ use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; -use cosmwasm_std::{coins, to_json_binary, Addr, Coin, Decimal, Empty, Uint128, Validator}; +use cosmwasm_std::{coins, to_json_binary, Addr, Coin, Decimal, Uint128, Validator}; use cw20::{Cw20Coin, Cw20ExecuteMsg, Cw20ReceiveMsg}; use cw_denom::{CheckedDenom, UncheckedDenom}; -use cw_multi_test::{ - App, AppBuilder, BankSudo, Contract, ContractWrapper, Executor, StakingInfo, SudoMsg, -}; +use cw_multi_test::{App, AppBuilder, BankSudo, Executor, StakingInfo, SudoMsg}; use cw_ownable::Action; -use dao_testing::contracts::cw20_base_contract; +use dao_testing::contracts::{cw20_base_contract, cw_vesting_contract}; use crate::contract::{execute, execute_receive_cw20}; use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg, ReceiveMsg}; @@ -21,15 +19,6 @@ const TOTAL_VEST: u128 = 1000000; const OWNER: &str = "owner"; const NATIVE_DENOM: &str = "ujuno"; -fn cw_vesting_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ); - Box::new(contract) -} - fn get_vesting_payment(app: &App, cw_vesting_addr: Addr) -> Vest { app.wrap() .query_wasm_smart(cw_vesting_addr, &QueryMsg::Info {}) @@ -214,7 +203,7 @@ fn test_happy_cw20_path() { ); // No time has passed, so nothing is withdrawable. - let err: ContractError = app + let err: cw_vesting::ContractError = app .execute_contract( bob.clone(), cw_vesting_addr.clone(), @@ -226,7 +215,7 @@ fn test_happy_cw20_path() { .unwrap(); assert_eq!( err, - ContractError::InvalidWithdrawal { + cw_vesting::ContractError::InvalidWithdrawal { request: Uint128::zero(), claimable: Uint128::zero() } @@ -283,7 +272,7 @@ fn test_happy_native_path() { ); // No time has passed, so nothing is withdrawable. - let err: ContractError = app + let err: cw_vesting::ContractError = app .execute_contract( bob.clone(), cw_vesting_addr.clone(), @@ -295,7 +284,7 @@ fn test_happy_native_path() { .unwrap(); assert_eq!( err, - ContractError::InvalidWithdrawal { + cw_vesting::ContractError::InvalidWithdrawal { request: Uint128::zero(), claimable: Uint128::zero() } @@ -420,7 +409,7 @@ fn test_cancel_vesting() { } = setup_test_case(&mut app, InstantiateMsg::default(), &[]); // Non-owner can't cancel - let err: ContractError = app + let err: cw_vesting::ContractError = app .execute_contract( Addr::unchecked(ALICE), cw_vesting_addr.clone(), @@ -432,7 +421,7 @@ fn test_cancel_vesting() { .unwrap(); assert_eq!( err, - ContractError::Ownable(cw_ownable::OwnershipError::NotOwner) + cw_vesting::ContractError::Ownable(cw_ownable::OwnershipError::NotOwner) ); // Advance the clock by 1/2 the vesting period. @@ -451,7 +440,7 @@ fn test_cancel_vesting() { .unwrap(); // Can't distribute as tokens are already distributed. - let err: ContractError = app + let err: cw_vesting::ContractError = app .execute_contract( Addr::unchecked(BOB), cw_vesting_addr, @@ -461,7 +450,10 @@ fn test_cancel_vesting() { .unwrap_err() .downcast() .unwrap(); - assert!(matches!(err, ContractError::InvalidWithdrawal { .. })); + assert!(matches!( + err, + cw_vesting::ContractError::InvalidWithdrawal { .. } + )); // Unvested funds have been returned to contract owner assert_eq!( @@ -513,7 +505,7 @@ fn test_catch_imposter_cw20() { }; // Errors that cw20 does not match what was expected - let error: ContractError = app + let error: cw_vesting::ContractError = app .execute_contract( Addr::unchecked(OWNER), Addr::unchecked(cw20_imposter_addr), @@ -523,7 +515,7 @@ fn test_catch_imposter_cw20() { .unwrap_err() .downcast() .unwrap(); - assert_eq!(error, ContractError::WrongCw20); + assert_eq!(error, cw_vesting::ContractError::WrongCw20); } #[test] @@ -542,7 +534,7 @@ fn test_incorrect_native_funding_amount() { let (_, _, cw_vesting_code_id) = setup_contracts(&mut app); // Instantiate cw-vesting contract errors with incorrect amount - let error: ContractError = app + let error: cw_vesting::ContractError = app .instantiate_contract( cw_vesting_code_id, alice, @@ -556,7 +548,7 @@ fn test_incorrect_native_funding_amount() { .unwrap(); assert_eq!( error, - ContractError::WrongFundAmount { + cw_vesting::ContractError::WrongFundAmount { sent: Uint128::new(100), expected: Uint128::new(TOTAL_VEST) } diff --git a/contracts/external/cw721-roles/src/tests.rs b/contracts/external/cw721-roles/src/tests.rs index 41c559413..365772b9b 100644 --- a/contracts/external/cw721-roles/src/tests.rs +++ b/contracts/external/cw721-roles/src/tests.rs @@ -3,7 +3,7 @@ use cw4::{HooksResponse, Member, MemberListResponse, MemberResponse, TotalWeight use cw721::{NftInfoResponse, OwnerOfResponse}; use cw_multi_test::{App, Executor}; use dao_cw721_extensions::roles::{ExecuteExt, MetadataExt, QueryExt}; -use dao_testing::contracts::{cw721_roles_contract, cw721_staked_voting_contract}; +use dao_testing::contracts::{cw721_roles_contract, dao_voting_cw721_staked_contract}; use dao_voting_cw721_staked::msg::{InstantiateMsg as Cw721StakedInstantiateMsg, NftContract}; use crate::error::RolesContractError; @@ -254,7 +254,7 @@ fn test_send_permissions() { .unwrap(); // Instantiate an NFT staking voting contract for testing SendNft - let dao_voting_cw721_staked_id = app.store_code(cw721_staked_voting_contract()); + let dao_voting_cw721_staked_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_staked_addr = app .instantiate_contract( dao_voting_cw721_staked_id, diff --git a/contracts/external/dao-migrator/Cargo.toml b/contracts/external/dao-migrator/Cargo.toml index 4d2b48cb8..429ebaaab 100644 --- a/contracts/external/dao-migrator/Cargo.toml +++ b/contracts/external/dao-migrator/Cargo.toml @@ -40,12 +40,13 @@ cw-core-v1 = { workspace = true, features = ["library"] } cw-proposal-single-v1 = { workspace = true, features = ["library"] } cw20-staked-balance-voting-v1 = { workspace = true, features = ["library"] } cw20-stake-v1 = { workspace = true, features = ["library"] } -cw-core-interface-v1 = { package = "cw-core-interface", version = "0.1.0", git = "https://github.com/DA0-DA0/dao-contracts.git", tag = "v1.0.0" } -cw4-voting-v1 = { package = "cw4-voting", version = "0.1.0", git = "https://github.com/DA0-DA0/dao-contracts.git", tag = "v1.0.0" } -cw20-v1 = { version = "0.13", package = "cw20" } -cw4-v1 = { version = "0.13", package = "cw4" } +cw-core-interface-v1 = { workspace = true } +cw4-voting-v1 = { workspace = true } +cw20-v1 = { workspace = true } +cw4-v1 = { workspace = true } [dev-dependencies] +dao-migrator = { workspace = true } cosmwasm-schema = { workspace = true } cw-multi-test = { workspace = true } dao-testing = { workspace = true } diff --git a/contracts/external/dao-migrator/src/testing/helpers.rs b/contracts/external/dao-migrator/src/testing/helpers.rs index c25d13507..a65d5b753 100644 --- a/contracts/external/dao-migrator/src/testing/helpers.rs +++ b/contracts/external/dao-migrator/src/testing/helpers.rs @@ -5,8 +5,12 @@ use cosmwasm_std::{ use cw_multi_test::{next_block, App, Contract, ContractWrapper, Executor}; use dao_interface::query::SubDao; use dao_testing::contracts::{ - cw20_base_contract, cw20_staked_balances_voting_contract, cw4_group_contract, dao_dao_contract, - proposal_single_contract, v1_dao_dao_contract, v1_proposal_single_contract, + cw20_base_contract, cw20_stake_contract, cw4_group_contract, dao_dao_core_contract, + dao_proposal_single_contract, dao_voting_cw20_staked_contract, dao_voting_cw4_contract, + v1::{ + cw20_stake_v1_contract, cw4_voting_v1_contract, cw_core_v1_contract, + cw_proposal_single_v1_contract, + }, }; use crate::{ @@ -50,13 +54,13 @@ pub enum VotingType { pub fn get_v1_code_ids(app: &mut App) -> (CodeIds, V1CodeIds) { let code_ids = CodeIds { - core: app.store_code(v1_dao_dao_contract()), - proposal_single: app.store_code(v1_proposal_single_contract()), + core: app.store_code(cw_core_v1_contract()), + proposal_single: app.store_code(cw_proposal_single_v1_contract()), cw20_base: app.store_code(cw20_base_contract()), - cw20_stake: app.store_code(v1_cw20_stake_contract()), - cw20_voting: app.store_code(cw20_staked_balances_voting_contract()), + cw20_stake: app.store_code(cw20_stake_v1_contract()), + cw20_voting: app.store_code(dao_voting_cw20_staked_contract()), cw4_group: app.store_code(cw4_group_contract()), - cw4_voting: app.store_code(v1_cw4_voting_contract()), + cw4_voting: app.store_code(cw4_voting_v1_contract()), }; let v1_code_ids = V1CodeIds { @@ -70,10 +74,10 @@ pub fn get_v1_code_ids(app: &mut App) -> (CodeIds, V1CodeIds) { pub fn get_v2_code_ids(app: &mut App) -> (CodeIds, V2CodeIds) { let code_ids = CodeIds { - core: app.store_code(dao_dao_contract()), - proposal_single: app.store_code(proposal_single_contract()), + core: app.store_code(dao_dao_core_contract()), + proposal_single: app.store_code(dao_proposal_single_contract()), cw20_base: app.store_code(cw20_base_contract()), - cw20_stake: app.store_code(v2_cw20_stake_contract()), + cw20_stake: app.store_code(cw20_stake_contract()), cw20_voting: app.store_code(dao_voting_cw20_staked_contract()), cw4_group: app.store_code(cw4_group_contract()), cw4_voting: app.store_code(dao_voting_cw4_contract()), @@ -267,67 +271,6 @@ pub fn set_cw20_to_dao(app: &mut App, sender: Addr, addrs: ModuleAddrs) { ); } -pub fn dao_voting_cw20_staked_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_staked::contract::execute, - dao_voting_cw20_staked::contract::instantiate, - dao_voting_cw20_staked::contract::query, - ) - .with_reply(dao_voting_cw20_staked::contract::reply) - .with_migrate(dao_voting_cw20_staked::contract::migrate); - Box::new(contract) -} - -pub fn migrator_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply); - Box::new(contract) -} - -pub fn v1_cw20_stake_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake_v1::contract::execute, - cw20_stake_v1::contract::instantiate, - cw20_stake_v1::contract::query, - ); - Box::new(contract) -} - -pub fn v2_cw20_stake_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ) - .with_migrate(cw20_stake::contract::migrate); - Box::new(contract) -} - -pub fn v1_cw4_voting_contract() -> Box> { - let contract = ContractWrapper::new( - cw4_voting_v1::contract::execute, - cw4_voting_v1::contract::instantiate, - cw4_voting_v1::contract::query, - ) - .with_reply(cw4_voting_v1::contract::reply); - Box::new(contract) -} - -pub fn dao_voting_cw4_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw4::contract::execute, - dao_voting_cw4::contract::instantiate, - dao_voting_cw4::contract::query, - ) - .with_reply(dao_voting_cw4::contract::reply) - .with_migrate(dao_voting_cw4::contract::migrate); - Box::new(contract) -} - fn some_init( _deps: DepsMut, _env: Env, diff --git a/contracts/external/dao-migrator/src/testing/setup.rs b/contracts/external/dao-migrator/src/testing/setup.rs index becb49522..4b039a502 100644 --- a/contracts/external/dao-migrator/src/testing/setup.rs +++ b/contracts/external/dao-migrator/src/testing/setup.rs @@ -3,7 +3,7 @@ use std::borrow::BorrowMut; use cosmwasm_std::{to_json_binary, Addr, WasmMsg}; use cw_multi_test::{next_block, App, AppResponse, Executor}; use dao_interface::state::{Admin, ModuleInstantiateInfo}; -use dao_testing::contracts::stake_cw20_v03_contract; +use dao_testing::contracts::{dao_migrator_contract, v1::stake_cw20_v03_contract}; use crate::{ testing::helpers::get_module_addrs, @@ -11,8 +11,8 @@ use crate::{ }; use super::helpers::{ - get_cw20_init_msg, get_cw4_init_msg, get_v1_code_ids, get_v2_code_ids, migrator_contract, - set_cw20_to_dao, set_dummy_proposal, ExecuteParams, ModuleAddrs, VotingType, SENDER_ADDR, + get_cw20_init_msg, get_cw4_init_msg, get_v1_code_ids, get_v2_code_ids, set_cw20_to_dao, + set_dummy_proposal, ExecuteParams, ModuleAddrs, VotingType, SENDER_ADDR, }; pub fn init_v1(app: &mut App, sender: Addr, voting_type: VotingType) -> (Addr, V1CodeIds) { @@ -255,7 +255,7 @@ pub fn execute_migration( custom_proposal_params: Option>, ) -> Result { let sender = Addr::unchecked(SENDER_ADDR); - let migrator_code_id = app.store_code(migrator_contract()); + let migrator_code_id = app.store_code(dao_migrator_contract()); let (new_code_ids, v2_code_ids) = get_v2_code_ids(app); let params = params.unwrap_or_else(|| ExecuteParams { sub_daos: Some(vec![]), @@ -368,7 +368,7 @@ pub fn execute_migration_from_core( params: Option, ) -> Result { let sender = Addr::unchecked(SENDER_ADDR); - let migrator_code_id = app.store_code(migrator_contract()); + let migrator_code_id = app.store_code(dao_migrator_contract()); let (new_code_ids, v2_code_ids) = get_v2_code_ids(app); let params = params.unwrap_or_else(|| ExecuteParams { sub_daos: Some(vec![]), diff --git a/contracts/external/dao-migrator/src/testing/test_migration.rs b/contracts/external/dao-migrator/src/testing/test_migration.rs index 691e00c9f..514216fa4 100644 --- a/contracts/external/dao-migrator/src/testing/test_migration.rs +++ b/contracts/external/dao-migrator/src/testing/test_migration.rs @@ -14,8 +14,8 @@ use crate::{ }, }, types::ProposalParams, - ContractError, }; +use dao_migrator::ContractError; use super::{helpers::demo_contract, setup::setup_dao_v1_multiple_proposals}; diff --git a/contracts/pre-propose/dao-pre-propose-approval-single/src/tests.rs b/contracts/pre-propose/dao-pre-propose-approval-single/src/tests.rs index 2e3f3e324..fe4cacd04 100644 --- a/contracts/pre-propose/dao-pre-propose-approval-single/src/tests.rs +++ b/contracts/pre-propose/dao-pre-propose-approval-single/src/tests.rs @@ -1,17 +1,25 @@ -use cosmwasm_std::{ - coins, from_json, to_json_binary, Addr, Coin, CosmosMsg, Empty, Uint128, WasmMsg, -}; +use cosmwasm_std::{coins, from_json, to_json_binary, Addr, Coin, CosmosMsg, Uint128, WasmMsg}; use cw2::ContractVersion; use cw20::Cw20Coin; use cw_denom::UncheckedDenom; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, BankSudo, Executor}; use cw_utils::Duration; use dao_interface::proposal::InfoResponse; use dao_interface::state::ProposalModule; use dao_interface::state::{Admin, ModuleInstantiateInfo}; use dao_pre_propose_base::{error::PreProposeError, msg::DepositInfoResponse, state::Config}; use dao_proposal_single::query::ProposalResponse; -use dao_testing::{contracts::cw4_group_contract, helpers::instantiate_with_cw4_groups_governance}; +use dao_testing::{ + contracts::{ + cw20_base_contract, cw4_group_contract, dao_pre_propose_approval_single_contract, + dao_proposal_single_contract, + v241::{ + dao_dao_core_v241_contract, dao_pre_propose_approval_single_v241_contract, + dao_proposal_single_v241_contract, dao_voting_cw4_v241_contract, + }, + }, + helpers::instantiate_with_cw4_groups_governance, +}; use dao_voting::pre_propose::{PreProposeSubmissionPolicy, PreProposeSubmissionPolicyError}; use dao_voting::{ deposit::{CheckedDepositInfo, DepositRefundPolicy, DepositToken, UncheckedDepositInfo}, @@ -22,7 +30,6 @@ use dao_voting::{ }; // test v2.4.1 migration -use dao_dao_core_v241 as core_v241; use dao_interface_v241 as di_v241; use dao_pre_propose_approval_single_v241 as dppas_v241; use dao_proposal_single_v241 as dps_v241; @@ -32,31 +39,6 @@ use dao_voting_v241 as dv_v241; use crate::state::{Proposal, ProposalStatus}; use crate::{contract::*, msg::*}; -fn dao_proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_single::contract::execute, - dao_proposal_single::contract::instantiate, - dao_proposal_single::contract::query, - ) - .with_migrate(dao_proposal_single::contract::migrate) - .with_reply(dao_proposal_single::contract::reply); - Box::new(contract) -} - -fn dao_pre_propose_approval_single_contract() -> Box> { - let contract = ContractWrapper::new(execute, instantiate, query).with_migrate(migrate); - Box::new(contract) -} - -fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - fn get_default_proposal_module_instantiate( app: &mut App, deposit_info: Option, @@ -2492,41 +2474,11 @@ fn test_withdraw() { fn test_migrate_from_v241() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dpps_v241_contract = Box::new(ContractWrapper::new( - dppas_v241::contract::execute, - dppas_v241::contract::instantiate, - dppas_v241::contract::query, - )); - let dps_v241_contract = Box::new( - ContractWrapper::new( - dps_v241::contract::execute, - dps_v241::contract::instantiate, - dps_v241::contract::query, - ) - .with_reply(dps_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dpps_v241_id = app.store_code(dpps_v241_contract); - let dps_v241_id = app.store_code(dps_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dpps_v241_id = app.store_code(dao_pre_propose_approval_single_v241_contract()); + let dps_v241_id = app.store_code(dao_proposal_single_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, @@ -2848,41 +2800,11 @@ fn test_migrate_from_v241() { fn test_migrate_from_v241_with_policy_update() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dpps_v241_contract = Box::new(ContractWrapper::new( - dppas_v241::contract::execute, - dppas_v241::contract::instantiate, - dppas_v241::contract::query, - )); - let dps_v241_contract = Box::new( - ContractWrapper::new( - dps_v241::contract::execute, - dps_v241::contract::instantiate, - dps_v241::contract::query, - ) - .with_reply(dps_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dpps_v241_id = app.store_code(dpps_v241_contract); - let dps_v241_id = app.store_code(dps_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dpps_v241_id = app.store_code(dao_pre_propose_approval_single_v241_contract()); + let dps_v241_id = app.store_code(dao_proposal_single_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, diff --git a/contracts/pre-propose/dao-pre-propose-approver/src/tests.rs b/contracts/pre-propose/dao-pre-propose-approver/src/tests.rs index c1475939a..8dc569995 100644 --- a/contracts/pre-propose/dao-pre-propose-approver/src/tests.rs +++ b/contracts/pre-propose/dao-pre-propose-approver/src/tests.rs @@ -1,8 +1,8 @@ -use cosmwasm_std::{coins, from_json, to_json_binary, Addr, Coin, Empty, Uint128}; +use cosmwasm_std::{coins, from_json, to_json_binary, Addr, Coin, Uint128}; use cw2::ContractVersion; use cw20::Cw20Coin; use cw_denom::UncheckedDenom; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, BankSudo, Executor}; use dao_interface::proposal::InfoResponse; use dao_voting::pre_propose::{PreProposeSubmissionPolicy, PreProposeSubmissionPolicyError}; use dps::query::{ProposalListResponse, ProposalResponse}; @@ -17,6 +17,10 @@ use dao_pre_propose_approval_single::{ }; use dao_pre_propose_base::{error::PreProposeError, msg::DepositInfoResponse, state::Config}; use dao_proposal_single as dps; +use dao_testing::contracts::{ + cw20_base_contract, dao_pre_propose_approval_single_contract, + dao_pre_propose_approver_contract, dao_proposal_single_contract, +}; use dao_testing::helpers::instantiate_with_cw4_groups_governance; use dao_voting::{ deposit::{CheckedDepositInfo, DepositRefundPolicy, DepositToken, UncheckedDepositInfo}, @@ -36,50 +40,12 @@ use crate::msg::{ // The approver dao contract is the 6th contract instantiated const APPROVER: &str = "contract6"; -fn cw_dao_proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - dps::contract::execute, - dps::contract::instantiate, - dps::contract::query, - ) - .with_migrate(dps::contract::migrate) - .with_reply(dps::contract::reply); - Box::new(contract) -} - -fn cw_pre_propose_base_proposal_single() -> Box> { - let contract = ContractWrapper::new( - dao_pre_propose_approval_single::contract::execute, - dao_pre_propose_approval_single::contract::instantiate, - dao_pre_propose_approval_single::contract::query, - ); - Box::new(contract) -} - -fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn pre_propose_approver_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ); - Box::new(contract) -} - fn get_proposal_module_approval_single_instantiate( app: &mut App, deposit_info: Option, open_proposal_submission: bool, ) -> dps::msg::InstantiateMsg { - let pre_propose_id = app.store_code(cw_pre_propose_base_proposal_single()); + let pre_propose_id = app.store_code(dao_pre_propose_approval_single_contract()); let submission_policy = if open_proposal_submission { PreProposeSubmissionPolicy::Anyone { denylist: vec![] } @@ -126,7 +92,7 @@ fn get_proposal_module_approver_instantiate( _open_proposal_submission: bool, pre_propose_approval_contract: String, ) -> dps::msg::InstantiateMsg { - let pre_propose_id = app.store_code(pre_propose_approver_contract()); + let pre_propose_id = app.store_code(dao_pre_propose_approver_contract()); dps::msg::InstantiateMsg { threshold: Threshold::AbsolutePercentage { @@ -191,7 +157,7 @@ fn setup_default_test( deposit_info: Option, open_proposal_submission: bool, ) -> DefaultTestSetup { - let dps_id = app.store_code(cw_dao_proposal_single_contract()); + let dps_id = app.store_code(dao_proposal_single_contract()); // Instantiate SubDAO with pre-propose-approval-single let proposal_module_instantiate = get_proposal_module_approval_single_instantiate( diff --git a/contracts/pre-propose/dao-pre-propose-multiple/src/tests.rs b/contracts/pre-propose/dao-pre-propose-multiple/src/tests.rs index f949702c2..e27c14e17 100644 --- a/contracts/pre-propose/dao-pre-propose-multiple/src/tests.rs +++ b/contracts/pre-propose/dao-pre-propose-multiple/src/tests.rs @@ -5,14 +5,24 @@ use cpm::query::ProposalResponse; use cw2::ContractVersion; use cw20::Cw20Coin; use cw_denom::UncheckedDenom; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, BankSudo, Executor}; use cw_utils::Duration; use dao_interface::proposal::InfoResponse; use dao_interface::state::ProposalModule; use dao_interface::state::{Admin, ModuleInstantiateInfo}; use dao_pre_propose_base::{error::PreProposeError, msg::DepositInfoResponse, state::Config}; use dao_proposal_multiple as cpm; -use dao_testing::{contracts::cw4_group_contract, helpers::instantiate_with_cw4_groups_governance}; +use dao_testing::{ + contracts::{ + cw20_base_contract, cw4_group_contract, dao_pre_propose_multiple_contract, + dao_proposal_multiple_contract, + v241::{ + dao_dao_core_v241_contract, dao_pre_propose_multiple_v241_contract, + dao_proposal_multiple_v241_contract, dao_voting_cw4_v241_contract, + }, + }, + helpers::instantiate_with_cw4_groups_governance, +}; use dao_voting::multiple_choice::MultipleChoiceAutoVote; use dao_voting::pre_propose::{PreProposeSubmissionPolicy, PreProposeSubmissionPolicyError}; use dao_voting::{ @@ -27,7 +37,6 @@ use dao_voting::{ }; // test v2.4.1 migration -use dao_dao_core_v241 as core_v241; use dao_interface_v241 as di_v241; use dao_pre_propose_multiple_v241 as dppm_v241; use dao_proposal_multiple_v241 as dpm_v241; @@ -36,30 +45,6 @@ use dao_voting_v241 as dv_v241; use crate::contract::*; -fn dao_proposal_multiple_contract() -> Box> { - let contract = ContractWrapper::new( - cpm::contract::execute, - cpm::contract::instantiate, - cpm::contract::query, - ) - .with_reply(cpm::contract::reply); - Box::new(contract) -} - -fn dao_pre_propose_multiple_contract() -> Box> { - let contract = ContractWrapper::new(execute, instantiate, query).with_migrate(migrate); - Box::new(contract) -} - -fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - fn get_default_proposal_module_instantiate( app: &mut App, deposit_info: Option, @@ -2247,41 +2232,11 @@ fn test_withdraw() { fn test_migrate_from_v241() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dppm_v241_contract = Box::new(ContractWrapper::new( - dppm_v241::contract::execute, - dppm_v241::contract::instantiate, - dppm_v241::contract::query, - )); - let dpm_v241_contract = Box::new( - ContractWrapper::new( - dpm_v241::contract::execute, - dpm_v241::contract::instantiate, - dpm_v241::contract::query, - ) - .with_reply(dpm_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dppm_v241_id = app.store_code(dppm_v241_contract); - let dpm_v241_id = app.store_code(dpm_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dppm_v241_id = app.store_code(dao_pre_propose_multiple_v241_contract()); + let dpm_v241_id = app.store_code(dao_proposal_multiple_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, @@ -2629,41 +2584,11 @@ fn test_migrate_from_v241() { fn test_migrate_from_v241_with_policy_update() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dppm_v241_contract = Box::new(ContractWrapper::new( - dppm_v241::contract::execute, - dppm_v241::contract::instantiate, - dppm_v241::contract::query, - )); - let dpm_v241_contract = Box::new( - ContractWrapper::new( - dpm_v241::contract::execute, - dpm_v241::contract::instantiate, - dpm_v241::contract::query, - ) - .with_reply(dpm_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dppm_v241_id = app.store_code(dppm_v241_contract); - let dpm_v241_id = app.store_code(dpm_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dppm_v241_id = app.store_code(dao_pre_propose_multiple_v241_contract()); + let dpm_v241_id = app.store_code(dao_proposal_multiple_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, diff --git a/contracts/pre-propose/dao-pre-propose-single/src/tests.rs b/contracts/pre-propose/dao-pre-propose-single/src/tests.rs index a8eef5e3e..8c037240c 100644 --- a/contracts/pre-propose/dao-pre-propose-single/src/tests.rs +++ b/contracts/pre-propose/dao-pre-propose-single/src/tests.rs @@ -4,14 +4,24 @@ use cosmwasm_std::{ use cw2::ContractVersion; use cw20::Cw20Coin; use cw_denom::UncheckedDenom; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, BankSudo, Executor}; use cw_utils::Duration; use dao_interface::proposal::InfoResponse; use dao_interface::state::ProposalModule; use dao_interface::state::{Admin, ModuleInstantiateInfo}; use dao_pre_propose_base::{error::PreProposeError, msg::DepositInfoResponse, state::Config}; use dao_proposal_single as dps; -use dao_testing::{contracts::cw4_group_contract, helpers::instantiate_with_cw4_groups_governance}; +use dao_testing::{ + contracts::{ + cw20_base_contract, cw4_group_contract, dao_pre_propose_single_contract, + dao_proposal_single_contract, + v241::{ + dao_dao_core_v241_contract, dao_pre_propose_single_v241_contract, + dao_proposal_single_v241_contract, dao_voting_cw4_v241_contract, + }, + }, + helpers::instantiate_with_cw4_groups_governance, +}; use dao_voting::pre_propose::{PreProposeSubmissionPolicy, PreProposeSubmissionPolicyError}; use dao_voting::{ deposit::{CheckedDepositInfo, DepositRefundPolicy, DepositToken, UncheckedDepositInfo}, @@ -23,7 +33,6 @@ use dao_voting::{ use dps::query::ProposalResponse; // test v2.4.1 migration -use dao_dao_core_v241 as core_v241; use dao_interface_v241 as di_v241; use dao_pre_propose_single_v241 as dpps_v241; use dao_proposal_single_v241 as dps_v241; @@ -32,31 +41,6 @@ use dao_voting_v241 as dv_v241; use crate::contract::*; -fn dao_proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - dps::contract::execute, - dps::contract::instantiate, - dps::contract::query, - ) - .with_migrate(dps::contract::migrate) - .with_reply(dps::contract::reply); - Box::new(contract) -} - -fn dao_pre_propose_single_contract() -> Box> { - let contract = ContractWrapper::new(execute, instantiate, query).with_migrate(migrate); - Box::new(contract) -} - -fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - fn get_default_proposal_module_instantiate( app: &mut App, deposit_info: Option, @@ -2186,41 +2170,11 @@ fn test_hook_management() { fn test_migrate_from_v241() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dpps_v241_contract = Box::new(ContractWrapper::new( - dpps_v241::contract::execute, - dpps_v241::contract::instantiate, - dpps_v241::contract::query, - )); - let dps_v241_contract = Box::new( - ContractWrapper::new( - dps_v241::contract::execute, - dps_v241::contract::instantiate, - dps_v241::contract::query, - ) - .with_reply(dps_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dpps_v241_id = app.store_code(dpps_v241_contract); - let dps_v241_id = app.store_code(dps_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dpps_v241_id = app.store_code(dao_pre_propose_single_v241_contract()); + let dps_v241_id = app.store_code(dao_proposal_single_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, @@ -2513,41 +2467,11 @@ fn test_migrate_from_v241() { fn test_migrate_from_v241_with_policy_update() { let app = &mut App::default(); - let core_v241_contract = Box::new( - ContractWrapper::new( - core_v241::contract::execute, - core_v241::contract::instantiate, - core_v241::contract::query, - ) - .with_reply(core_v241::contract::reply), - ); - let dvcw4_v241_contract = Box::new( - ContractWrapper::new( - dvcw4_v241::contract::execute, - dvcw4_v241::contract::instantiate, - dvcw4_v241::contract::query, - ) - .with_reply(dvcw4_v241::contract::reply), - ); - let dpps_v241_contract = Box::new(ContractWrapper::new( - dpps_v241::contract::execute, - dpps_v241::contract::instantiate, - dpps_v241::contract::query, - )); - let dps_v241_contract = Box::new( - ContractWrapper::new( - dps_v241::contract::execute, - dps_v241::contract::instantiate, - dps_v241::contract::query, - ) - .with_reply(dps_v241::contract::reply), - ); - - let core_id = app.store_code(core_v241_contract); + let core_id = app.store_code(dao_dao_core_v241_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let dvcw4_v241_id = app.store_code(dvcw4_v241_contract); - let dpps_v241_id = app.store_code(dpps_v241_contract); - let dps_v241_id = app.store_code(dps_v241_contract); + let dvcw4_v241_id = app.store_code(dao_voting_cw4_v241_contract()); + let dpps_v241_id = app.store_code(dao_pre_propose_single_v241_contract()); + let dps_v241_id = app.store_code(dao_proposal_single_v241_contract()); let governance_instantiate = di_v241::msg::InstantiateMsg { dao_uri: None, diff --git a/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs b/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs index c268bc5c1..7ab46d511 100644 --- a/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs +++ b/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs @@ -6,7 +6,8 @@ use dao_interface::{ voting::InfoResponse, }; use dao_testing::contracts::{ - cw4_group_contract, dao_dao_contract, dao_voting_cw4_contract, proposal_condorcet_contract, + cw4_group_contract, dao_dao_core_contract, dao_proposal_condorcet_contract, + dao_voting_cw4_contract, }; use dao_voting::threshold::PercentageThreshold; use dao_voting_cw4::msg::GroupContract; @@ -74,8 +75,8 @@ impl SuiteBuilder { let sender = Addr::unchecked(&initial_members[0].addr); let mut app = App::default(); - let condorcet_id = app.store_code(proposal_condorcet_contract()); - let core_id = app.store_code(dao_dao_contract()); + let condorcet_id = app.store_code(dao_proposal_condorcet_contract()); + let core_id = app.store_code(dao_dao_core_contract()); let cw4_id = app.store_code(cw4_group_contract()); let cw4_voting_id = app.store_code(dao_voting_cw4_contract()); diff --git a/contracts/proposal/dao-proposal-multiple/Cargo.toml b/contracts/proposal/dao-proposal-multiple/Cargo.toml index 5eca7e2df..b37648976 100644 --- a/contracts/proposal/dao-proposal-multiple/Cargo.toml +++ b/contracts/proposal/dao-proposal-multiple/Cargo.toml @@ -41,6 +41,7 @@ dao-pre-propose-multiple = { workspace = true } voting-v1 = { workspace = true } [dev-dependencies] +dao-proposal-multiple = { workspace = true } anyhow = { workspace = true } cw-multi-test = { workspace = true } dao-voting-cw4 = { workspace = true } diff --git a/contracts/proposal/dao-proposal-multiple/src/testing/adversarial_tests.rs b/contracts/proposal/dao-proposal-multiple/src/testing/adversarial_tests.rs index 8f3b593ea..0ffc0ccb1 100644 --- a/contracts/proposal/dao-proposal-multiple/src/testing/adversarial_tests.rs +++ b/contracts/proposal/dao-proposal-multiple/src/testing/adversarial_tests.rs @@ -8,11 +8,11 @@ use crate::testing::queries::{ query_balance_cw20, query_dao_token, query_multiple_proposal_module, query_proposal, }; use crate::testing::tests::{get_pre_propose_info, ALTERNATIVE_ADDR, CREATOR_ADDR}; -use crate::ContractError; use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, Decimal, Uint128, WasmMsg}; use cw20::Cw20Coin; use cw_multi_test::{next_block, App, Executor}; use cw_utils::Duration; +use dao_proposal_multiple::ContractError; use dao_voting::{ deposit::{DepositRefundPolicy, UncheckedDepositInfo, VotingModuleTokenType}, multiple_choice::{ diff --git a/contracts/proposal/dao-proposal-multiple/src/testing/do_votes.rs b/contracts/proposal/dao-proposal-multiple/src/testing/do_votes.rs index 51a0747b8..959c96da3 100644 --- a/contracts/proposal/dao-proposal-multiple/src/testing/do_votes.rs +++ b/contracts/proposal/dao-proposal-multiple/src/testing/do_votes.rs @@ -3,7 +3,7 @@ use cw20::Cw20Coin; use cw_denom::CheckedDenom; use cw_multi_test::{App, BankSudo, Executor}; use dao_interface::state::ProposalModule; -use dao_testing::ShouldExecute; +use dao_testing::{contracts::dao_proposal_multiple_contract, ShouldExecute}; use dao_voting::{ deposit::{CheckedDepositInfo, UncheckedDepositInfo}, multiple_choice::{ @@ -23,7 +23,7 @@ use crate::{ instantiate_with_cw20_balances_governance, instantiate_with_staked_balances_governance, }, queries::query_deposit_config_and_pre_propose_module, - tests::{get_pre_propose_info, proposal_multiple_contract, TestMultipleChoiceVote}, + tests::{get_pre_propose_info, TestMultipleChoiceVote}, }, }; use dao_pre_propose_multiple as cppm; @@ -96,7 +96,7 @@ where F: Fn(&mut App, InstantiateMsg, Option>) -> Addr, { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let mut initial_balances = votes .iter() diff --git a/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs b/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs index 693edfbb0..bb0eacb29 100644 --- a/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs +++ b/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs @@ -1,13 +1,14 @@ use cosmwasm_std::{to_json_binary, Addr, Coin, Empty, Uint128}; use cw20::Cw20Coin; -use cw_multi_test::{next_block, App, BankSudo, ContractWrapper, Executor, SudoMsg}; +use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; use cw_utils::Duration; use dao_interface::state::{Admin, ModuleInstantiateInfo}; use dao_pre_propose_multiple as cppm; use dao_testing::contracts::{ - cw20_balances_voting_contract, cw20_base_contract, cw20_stake_contract, - cw20_staked_balances_voting_contract, cw4_group_contract, cw721_base_contract, - dao_dao_contract, native_staked_balances_voting_contract, pre_propose_multiple_contract, + cw20_base_contract, cw20_stake_contract, cw4_group_contract, cw721_base_contract, + dao_dao_core_contract, dao_pre_propose_multiple_contract, dao_proposal_multiple_contract, + dao_voting_cw20_balance_contract, dao_voting_cw20_staked_contract, + dao_voting_cw721_staked_contract, dao_voting_token_staked_contract, }; use dao_voting::{ deposit::{DepositRefundPolicy, UncheckedDepositInfo, VotingModuleTokenType}, @@ -21,9 +22,7 @@ use dao_voting::{ use dao_voting_cw4::msg::GroupContract; use crate::testing::tests::ALTERNATIVE_ADDR; -use crate::{ - msg::InstantiateMsg, testing::tests::proposal_multiple_contract, testing::tests::CREATOR_ADDR, -}; +use crate::{msg::InstantiateMsg, testing::tests::CREATOR_ADDR}; #[allow(dead_code)] fn get_pre_propose_info( @@ -31,7 +30,7 @@ fn get_pre_propose_info( deposit_info: Option, open_proposal_submission: bool, ) -> PreProposeInfo { - let pre_propose_contract = app.store_code(pre_propose_multiple_contract()); + let pre_propose_contract = app.store_code(dao_pre_propose_multiple_contract()); let submission_policy = if open_proposal_submission { PreProposeSubmissionPolicy::Anyone { denylist: vec![] } @@ -107,7 +106,7 @@ pub fn _instantiate_with_staked_cw721_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -132,15 +131,8 @@ pub fn _instantiate_with_staked_cw721_governance( }; let cw721_id = app.store_code(cw721_base_contract()); - let cw721_stake_id = app.store_code({ - let contract = ContractWrapper::new( - dao_voting_cw721_staked::contract::execute, - dao_voting_cw721_staked::contract::instantiate, - dao_voting_cw721_staked::contract::query, - ); - Box::new(contract) - }); - let core_contract_id = app.store_code(dao_dao_contract()); + let cw721_stake_id = app.store_code(dao_voting_cw721_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let nft_address = app .instantiate_contract( @@ -248,7 +240,7 @@ pub fn instantiate_with_native_staked_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -273,8 +265,8 @@ pub fn instantiate_with_native_staked_balances_governance( .collect() }; - let native_stake_id = app.store_code(native_staked_balances_voting_contract()); - let core_contract_id = app.store_code(dao_dao_contract()); + let native_stake_id = app.store_code(dao_voting_token_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { admin: None, @@ -360,11 +352,11 @@ pub fn instantiate_with_cw20_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let cw20_id = app.store_code(cw20_base_contract()); - let core_id = app.store_code(dao_dao_contract()); - let votemod_id = app.store_code(cw20_balances_voting_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_balance_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -441,7 +433,7 @@ pub fn instantiate_with_staked_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -468,8 +460,8 @@ pub fn instantiate_with_staked_balances_governance( let cw20_id = app.store_code(cw20_base_contract()); let cw20_stake_id = app.store_code(cw20_stake_contract()); - let staked_balances_voting_id = app.store_code(cw20_staked_balances_voting_contract()); - let core_contract_id = app.store_code(dao_dao_contract()); + let staked_balances_voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { admin: None, @@ -572,7 +564,7 @@ pub fn instantiate_with_multiple_staked_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![ @@ -605,8 +597,8 @@ pub fn instantiate_with_multiple_staked_balances_governance( let cw20_id = app.store_code(cw20_base_contract()); let cw20_stake_id = app.store_code(cw20_stake_contract()); - let staked_balances_voting_id = app.store_code(cw20_staked_balances_voting_contract()); - let core_contract_id = app.store_code(dao_dao_contract()); + let staked_balances_voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { admin: None, @@ -712,11 +704,11 @@ pub fn instantiate_with_staking_active_threshold( initial_balances: Option>, active_threshold: Option, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let cw20_id = app.store_code(cw20_base_contract()); let cw20_staking_id = app.store_code(cw20_stake_contract()); - let core_id = app.store_code(dao_dao_contract()); - let votemod_id = app.store_code(cw20_staked_balances_voting_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_staked_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -781,9 +773,9 @@ pub fn _instantiate_with_cw4_groups_governance( proposal_module_instantiate: InstantiateMsg, initial_weights: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_multiple_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_multiple_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let core_id = app.store_code(dao_dao_contract()); + let core_id = app.store_code(dao_dao_core_contract()); let votemod_id = app.store_code(cw4_group_contract()); let initial_weights = initial_weights.unwrap_or_else(|| { diff --git a/contracts/proposal/dao-proposal-multiple/src/testing/tests.rs b/contracts/proposal/dao-proposal-multiple/src/testing/tests.rs index 2b82b7ce7..5dab858ff 100644 --- a/contracts/proposal/dao-proposal-multiple/src/testing/tests.rs +++ b/contracts/proposal/dao-proposal-multiple/src/testing/tests.rs @@ -4,7 +4,7 @@ use cosmwasm_std::{ use cw20::Cw20Coin; use cw_denom::{CheckedDenom, UncheckedDenom}; use cw_hooks::HooksResponse; -use cw_multi_test::{next_block, App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; +use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; use cw_utils::Duration; use dao_interface::state::ProposalModule; use dao_interface::state::{Admin, ModuleInstantiateInfo}; @@ -49,12 +49,15 @@ use crate::{ query_proposal_config, query_proposal_hooks, query_vote_hooks, }, }, - ContractError, }; use dao_pre_propose_multiple as cppm; +use dao_proposal_multiple::ContractError; use dao_testing::{ - contracts::{cw20_balances_voting_contract, cw20_base_contract}, + contracts::{ + cw20_base_contract, dao_pre_propose_multiple_contract, dao_proposal_multiple_contract, + dao_voting_cw20_balance_contract, + }, ShouldExecute, }; @@ -72,31 +75,12 @@ pub struct TestMultipleChoiceVote { pub should_execute: ShouldExecute, } -pub fn proposal_multiple_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply); - Box::new(contract) -} - -pub fn pre_propose_multiple_contract() -> Box> { - let contract = ContractWrapper::new( - cppm::contract::execute, - cppm::contract::instantiate, - cppm::contract::query, - ); - Box::new(contract) -} - pub fn get_pre_propose_info( app: &mut App, deposit_info: Option, open_proposal_submission: bool, ) -> PreProposeInfo { - let pre_propose_contract = app.store_code(pre_propose_multiple_contract()); + let pre_propose_contract = app.store_code(dao_pre_propose_multiple_contract()); let submission_policy = if open_proposal_submission { PreProposeSubmissionPolicy::Anyone { denylist: vec![] } @@ -127,7 +111,7 @@ pub fn get_pre_propose_info( #[test] fn test_propose() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -209,7 +193,7 @@ fn test_propose() { #[test] fn test_propose_wrong_num_choices() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = cw_utils::Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -293,7 +277,7 @@ fn test_propose_wrong_num_choices() { #[test] fn test_proposal_count_initialized_to_zero() { let mut app = App::default(); - let _proposal_id = app.store_code(proposal_multiple_contract()); + let _proposal_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -328,7 +312,7 @@ fn test_proposal_count_initialized_to_zero() { #[test] fn test_propose_auto_vote_winner() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -419,7 +403,7 @@ fn test_propose_auto_vote_winner() { #[test] fn test_propose_auto_vote_reject() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -511,7 +495,7 @@ fn test_propose_auto_vote_reject() { #[should_panic(expected = "Not registered to vote (no voting power) at time of proposal creation")] fn test_propose_non_member_auto_vote_fail() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -577,7 +561,7 @@ fn test_propose_non_member_auto_vote_fail() { #[test] fn test_no_early_pass_with_min_duration() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -673,7 +657,7 @@ fn test_no_early_pass_with_min_duration() { #[test] fn test_propose_with_messages() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -795,7 +779,7 @@ fn test_propose_with_messages() { )] fn test_min_duration_units_missmatch() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -828,7 +812,7 @@ fn test_min_duration_units_missmatch() { #[should_panic(expected = "Min voting period must be less than or equal to max voting period")] fn test_min_duration_larger_than_proposal_duration() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -860,7 +844,7 @@ fn test_min_duration_larger_than_proposal_duration() { #[test] fn test_min_duration_same_as_proposal_duration() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let msg = InstantiateMsg { voting_strategy: VotingStrategy::SingleChoice { quorum: PercentageThreshold::Percent(Decimal::percent(10)), @@ -971,7 +955,7 @@ fn test_min_duration_same_as_proposal_duration() { #[test] fn test_voting_module_token_proposal_deposit_instantiate() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -1030,7 +1014,7 @@ fn test_voting_module_token_proposal_deposit_instantiate() { #[test] fn test_different_token_proposal_deposit() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let cw20_id = app.store_code(cw20_base_contract()); let cw20_addr = app .instantiate_contract( @@ -1084,9 +1068,9 @@ fn test_different_token_proposal_deposit() { #[should_panic(expected = "Error parsing into type dao_voting_cw20_balance::msg::QueryMsg")] fn test_bad_token_proposal_deposit() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let cw20_id = app.store_code(cw20_base_contract()); - let votemod_id = app.store_code(cw20_balances_voting_contract()); + let votemod_id = app.store_code(dao_voting_cw20_balance_contract()); let votemod_addr = app .instantiate_contract( @@ -1142,7 +1126,7 @@ fn test_bad_token_proposal_deposit() { #[test] fn test_take_proposal_deposit() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Percent(Decimal::percent(10)); let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -1250,7 +1234,7 @@ fn test_take_proposal_deposit() { #[test] fn test_take_native_proposal_deposit() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Percent(Decimal::percent(10)); let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -1345,7 +1329,7 @@ fn test_take_native_proposal_deposit() { #[test] fn test_native_proposal_deposit() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = cw_utils::Duration::Height(6); let instantiate = InstantiateMsg { @@ -1777,7 +1761,7 @@ fn test_cant_vote_executed_or_closed() { #[test] fn test_cant_propose_zero_power() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Percent(Decimal::percent(10)); let voting_strategy = VotingStrategy::SingleChoice { quorum }; let max_voting_period = cw_utils::Duration::Height(6); @@ -1953,7 +1937,7 @@ fn test_cant_vote_not_registered() { fn test_cant_execute_not_member() { // Create proposal with only_members_execute: true let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = cw_utils::Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -2045,7 +2029,7 @@ fn test_cant_execute_not_member_when_proposal_created() { // Create proposal with only_members_execute: true and ensure member cannot // execute if they were not a member when the proposal was created let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = cw_utils::Duration::Height(6); let quorum = PercentageThreshold::Majority {}; @@ -2164,7 +2148,7 @@ fn test_cant_execute_not_member_when_proposal_created() { #[test] fn test_open_proposal_submission() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let max_voting_period = cw_utils::Duration::Height(6); @@ -2469,7 +2453,7 @@ fn test_deposit_return_on_close() { #[test] fn test_execute_expired_proposal() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Percent(Decimal::percent(10)); let voting_strategy = VotingStrategy::SingleChoice { quorum }; let max_voting_period = cw_utils::Duration::Height(6); @@ -2768,7 +2752,7 @@ fn test_no_return_if_no_refunds() { #[test] fn test_query_list_proposals() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; let max_voting_period = cw_utils::Duration::Height(6); @@ -2904,7 +2888,7 @@ fn test_query_list_proposals() { #[test] fn test_hooks() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -3031,7 +3015,7 @@ fn test_hooks() { #[test] fn test_active_threshold_absolute() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -3163,7 +3147,7 @@ fn test_active_threshold_absolute() { #[test] fn test_active_threshold_percent() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; let max_voting_period = cw_utils::Duration::Height(6); @@ -3295,7 +3279,7 @@ fn test_active_threshold_percent() { #[test] fn test_active_threshold_none() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; let max_voting_period = cw_utils::Duration::Height(6); @@ -3407,7 +3391,7 @@ fn test_active_threshold_none() { #[test] fn test_revoting() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let core_addr = instantiate_with_staked_balances_governance( &mut app, InstantiateMsg { @@ -3541,7 +3525,7 @@ fn test_revoting() { #[test] fn test_allow_revoting_config_changes() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let core_addr = instantiate_with_staked_balances_governance( &mut app, InstantiateMsg { @@ -3696,7 +3680,7 @@ fn test_allow_revoting_config_changes() { #[test] fn test_revoting_same_vote_twice() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let core_addr = instantiate_with_staked_balances_governance( &mut app, InstantiateMsg { @@ -3792,7 +3776,7 @@ fn test_revoting_same_vote_twice() { #[test] fn test_invalid_revote_does_not_invalidate_initial_vote() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let core_addr = instantiate_with_staked_balances_governance( &mut app, InstantiateMsg { @@ -3987,7 +3971,7 @@ fn test_return_deposit_to_dao_on_proposal_failure() { #[test] fn test_close_failed_proposal() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let quorum = PercentageThreshold::Majority {}; let voting_strategy = VotingStrategy::SingleChoice { quorum }; @@ -4228,7 +4212,7 @@ fn test_close_failed_proposal() { #[test] fn test_no_double_refund_on_execute_fail_and_close() { let mut app = App::default(); - let _proposal_module_id = app.store_code(proposal_multiple_contract()); + let _proposal_module_id = app.store_code(dao_proposal_multiple_contract()); let voting_strategy = VotingStrategy::SingleChoice { quorum: PercentageThreshold::Majority {}, @@ -4424,7 +4408,7 @@ fn test_no_double_refund_on_execute_fail_and_close() { #[test] pub fn test_not_allow_voting_on_expired_proposal() { let mut app = App::default(); - let _govmod_id = app.store_code(proposal_multiple_contract()); + let _govmod_id = app.store_code(dao_proposal_multiple_contract()); let instantiate = InstantiateMsg { max_voting_period: Duration::Height(6), only_members_execute: false, diff --git a/contracts/proposal/dao-proposal-single/Cargo.toml b/contracts/proposal/dao-proposal-single/Cargo.toml index 06170dd00..142bd57dc 100644 --- a/contracts/proposal/dao-proposal-single/Cargo.toml +++ b/contracts/proposal/dao-proposal-single/Cargo.toml @@ -36,6 +36,7 @@ voting-v1 = { workspace = true } cw-proposal-single-v1 = { workspace = true, features = ["library"] } [dev-dependencies] +dao-proposal-single = { workspace = true } anyhow = { workspace = true } cosmwasm-schema = { workspace = true } cw-multi-test = { workspace = true } diff --git a/contracts/proposal/dao-proposal-single/src/testing/adversarial_tests.rs b/contracts/proposal/dao-proposal-single/src/testing/adversarial_tests.rs index beed03604..40b5fcd1c 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/adversarial_tests.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/adversarial_tests.rs @@ -23,7 +23,8 @@ use dao_voting::{ }; use super::CREATOR_ADDR; -use crate::{query::ProposalResponse, ContractError}; +use crate::query::ProposalResponse; +use dao_proposal_single::ContractError; struct CommonTest { app: App, diff --git a/contracts/proposal/dao-proposal-single/src/testing/contracts.rs b/contracts/proposal/dao-proposal-single/src/testing/contracts.rs deleted file mode 100644 index d222acbc5..000000000 --- a/contracts/proposal/dao-proposal-single/src/testing/contracts.rs +++ /dev/null @@ -1,108 +0,0 @@ -use cosmwasm_std::Empty; - -use cw_multi_test::{Contract, ContractWrapper}; -use dao_pre_propose_single as cppbps; - -pub(crate) fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn cw4_group_contract() -> Box> { - let contract = ContractWrapper::new( - cw4_group::contract::execute, - cw4_group::contract::instantiate, - cw4_group::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn cw721_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_base::entry::execute, - cw721_base::entry::instantiate, - cw721_base::entry::query, - ); - Box::new(contract) -} - -pub(crate) fn cw20_stake_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -pub(crate) fn pre_propose_single_contract() -> Box> { - let contract = ContractWrapper::new( - cppbps::contract::execute, - cppbps::contract::instantiate, - cppbps::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn cw20_staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_staked::contract::execute, - dao_voting_cw20_staked::contract::instantiate, - dao_voting_cw20_staked::contract::query, - ) - .with_reply(dao_voting_cw20_staked::contract::reply); - Box::new(contract) -} - -pub(crate) fn native_staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_token_staked::contract::execute, - dao_voting_token_staked::contract::instantiate, - dao_voting_token_staked::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn cw721_stake_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw721_staked::contract::execute, - dao_voting_cw721_staked::contract::instantiate, - dao_voting_cw721_staked::contract::query, - ); - Box::new(contract) -} - -pub(crate) fn cw_core_contract() -> Box> { - let contract = ContractWrapper::new( - dao_dao_core::contract::execute, - dao_dao_core::contract::instantiate, - dao_dao_core::contract::query, - ) - .with_reply(dao_dao_core::contract::reply); - Box::new(contract) -} - -pub(crate) fn cw4_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw4::contract::execute, - dao_voting_cw4::contract::instantiate, - dao_voting_cw4::contract::query, - ) - .with_reply(dao_voting_cw4::contract::reply); - Box::new(contract) -} diff --git a/contracts/proposal/dao-proposal-single/src/testing/execute.rs b/contracts/proposal/dao-proposal-single/src/testing/execute.rs index c8511271f..d9b32acfd 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/execute.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/execute.rs @@ -3,6 +3,7 @@ use cw_multi_test::{App, BankSudo, Executor}; use cw_denom::CheckedDenom; use dao_pre_propose_single as cppbps; +use dao_testing::contracts::cw20_base_contract; use dao_voting::{ deposit::CheckedDepositInfo, pre_propose::ProposalCreationPolicy, @@ -14,12 +15,10 @@ use crate::{ msg::{ExecuteMsg, QueryMsg}, query::ProposalResponse, testing::queries::{query_creation_policy, query_next_proposal_id}, - ContractError, }; +use dao_proposal_single::ContractError; -use super::{ - contracts::cw20_base_contract, queries::query_pre_proposal_single_config, CREATOR_ADDR, -}; +use super::{queries::query_pre_proposal_single_config, CREATOR_ADDR}; // Creates a proposal then checks that the proposal was created with // the specified messages and returns the ID of the proposal. diff --git a/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs b/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs index 217ad740f..4f469476f 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs @@ -6,6 +6,12 @@ use cw_utils::Duration; use dao_interface::state::{Admin, ModuleInstantiateInfo}; use dao_pre_propose_single as cppbps; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, cw4_group_contract, cw721_base_contract, + dao_dao_core_contract, dao_pre_propose_single_contract, dao_proposal_single_contract, + dao_voting_cw20_staked_contract, dao_voting_cw4_contract, dao_voting_cw721_staked_contract, + dao_voting_token_staked_contract, +}; use dao_voting::{ deposit::{DepositRefundPolicy, UncheckedDepositInfo, VotingModuleTokenType}, pre_propose::{PreProposeInfo, PreProposeSubmissionPolicy}, @@ -15,22 +21,14 @@ use dao_voting_cw4::msg::GroupContract; use crate::msg::InstantiateMsg; -use super::{ - contracts::{ - cw20_base_contract, cw20_stake_contract, cw20_staked_balances_voting_contract, - cw4_group_contract, cw4_voting_contract, cw721_base_contract, cw721_stake_contract, - cw_core_contract, native_staked_balances_voting_contract, proposal_single_contract, - }, - CREATOR_ADDR, -}; +use super::CREATOR_ADDR; pub(crate) fn get_pre_propose_info( app: &mut App, deposit_info: Option, open_proposal_submission: bool, ) -> PreProposeInfo { - let pre_propose_contract = - app.store_code(crate::testing::contracts::pre_propose_single_contract()); + let pre_propose_contract = app.store_code(dao_pre_propose_single_contract()); let submission_policy = if open_proposal_submission { PreProposeSubmissionPolicy::Anyone { denylist: vec![] } @@ -108,7 +106,7 @@ pub(crate) fn instantiate_with_staked_cw721_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_single_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_single_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -133,8 +131,8 @@ pub(crate) fn instantiate_with_staked_cw721_governance( }; let cw721_id = app.store_code(cw721_base_contract()); - let cw721_stake_id = app.store_code(cw721_stake_contract()); - let core_contract_id = app.store_code(cw_core_contract()); + let cw721_stake_id = app.store_code(dao_voting_cw721_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let nft_address = app .instantiate_contract( @@ -242,7 +240,7 @@ pub(crate) fn instantiate_with_native_staked_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_single_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_single_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -267,8 +265,8 @@ pub(crate) fn instantiate_with_native_staked_balances_governance( .collect() }; - let native_stake_id = app.store_code(native_staked_balances_voting_contract()); - let core_contract_id = app.store_code(cw_core_contract()); + let native_stake_id = app.store_code(dao_voting_token_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { admin: None, @@ -353,7 +351,7 @@ pub(crate) fn instantiate_with_staked_balances_governance( proposal_module_instantiate: InstantiateMsg, initial_balances: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_single_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_single_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -380,8 +378,8 @@ pub(crate) fn instantiate_with_staked_balances_governance( let cw20_id = app.store_code(cw20_base_contract()); let cw20_stake_id = app.store_code(cw20_stake_contract()); - let staked_balances_voting_id = app.store_code(cw20_staked_balances_voting_contract()); - let core_contract_id = app.store_code(cw_core_contract()); + let staked_balances_voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { admin: None, @@ -485,11 +483,11 @@ pub(crate) fn instantiate_with_staking_active_threshold( initial_balances: Option>, active_threshold: Option, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_single_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_single_contract()); let cw20_id = app.store_code(cw20_base_contract()); let cw20_staking_id = app.store_code(cw20_stake_contract()); - let core_id = app.store_code(cw_core_contract()); - let votemod_id = app.store_code(cw20_staked_balances_voting_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_staked_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -554,10 +552,10 @@ pub(crate) fn instantiate_with_cw4_groups_governance( proposal_module_instantiate: InstantiateMsg, initial_weights: Option>, ) -> Addr { - let proposal_module_code_id = app.store_code(proposal_single_contract()); + let proposal_module_code_id = app.store_code(dao_proposal_single_contract()); let cw4_id = app.store_code(cw4_group_contract()); - let core_id = app.store_code(cw_core_contract()); - let votemod_id = app.store_code(cw4_voting_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw4_contract()); let initial_weights = initial_weights.unwrap_or_else(|| { vec![Cw20Coin { diff --git a/contracts/proposal/dao-proposal-single/src/testing/migration_tests.rs b/contracts/proposal/dao-proposal-single/src/testing/migration_tests.rs index 83196d8cf..2aa4ce67e 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/migration_tests.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/migration_tests.rs @@ -4,8 +4,9 @@ use cw_multi_test::{next_block, App, Executor}; use cw_utils::Duration; use dao_interface::query::{GetItemResponse, ProposalModuleCountResponse}; use dao_testing::contracts::{ - cw20_base_contract, cw20_stake_contract, cw20_staked_balances_voting_contract, - dao_dao_contract, proposal_single_contract, v1_dao_dao_contract, v1_proposal_single_contract, + cw20_base_contract, cw20_stake_contract, dao_dao_core_contract, dao_proposal_single_contract, + dao_voting_cw20_staked_contract, + v1::{cw_core_v1_contract, cw_proposal_single_v1_contract}, }; use dao_voting::veto::VetoConfig; use dao_voting::{ @@ -47,14 +48,14 @@ fn test_v1_v2_full_migration() { // instantiate a v1 DAO // ---- - let proposal_code = app.store_code(v1_proposal_single_contract()); - let core_code = app.store_code(v1_dao_dao_contract()); + let proposal_code = app.store_code(cw_proposal_single_v1_contract()); + let core_code = app.store_code(cw_core_v1_contract()); // cw20 staking and voting module has not changed across v1->v2 so // we use the current edition. let cw20_code = app.store_code(cw20_base_contract()); let cw20_stake_code = app.store_code(cw20_stake_contract()); - let voting_code = app.store_code(cw20_staked_balances_voting_contract()); + let voting_code = app.store_code(dao_voting_cw20_staked_contract()); let initial_balances = vec![Cw20Coin { address: sender.to_string(), @@ -300,8 +301,8 @@ fn test_v1_v2_full_migration() { // create a proposal to migrate to v2 // ---- - let v2_core_code = app.store_code(dao_dao_contract()); - let v2_proposal_code = app.store_code(proposal_single_contract()); + let v2_core_code = app.store_code(dao_dao_core_contract()); + let v2_proposal_code = app.store_code(dao_proposal_single_contract()); let pre_propose_info = get_pre_propose_info( &mut app, diff --git a/contracts/proposal/dao-proposal-single/src/testing/mod.rs b/contracts/proposal/dao-proposal-single/src/testing/mod.rs index 12c9b9af0..0eede537c 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/mod.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/mod.rs @@ -1,5 +1,4 @@ mod adversarial_tests; -mod contracts; mod do_votes; mod execute; mod instantiate; diff --git a/contracts/proposal/dao-proposal-single/src/testing/queries.rs b/contracts/proposal/dao-proposal-single/src/testing/queries.rs index a246f1c64..0758fb27f 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/queries.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/queries.rs @@ -3,7 +3,7 @@ use cw_multi_test::App; use dao_interface::state::{ProposalModule, ProposalModuleStatus}; use cw_hooks::HooksResponse; -use dao_pre_propose_single as cppbps; +use dao_pre_propose_single as dpps; use dao_voting::pre_propose::ProposalCreationPolicy; use crate::{ @@ -15,7 +15,7 @@ use crate::{ pub(crate) fn query_deposit_config_and_pre_propose_module( app: &App, proposal_single: &Addr, -) -> (cppbps::Config, Addr) { +) -> (dpps::Config, Addr) { let proposal_creation_policy = query_creation_policy(app, proposal_single); if let ProposalCreationPolicy::Module { addr: module_addr } = proposal_creation_policy { @@ -118,9 +118,9 @@ pub(crate) fn query_list_proposals_reverse( .unwrap() } -pub(crate) fn query_pre_proposal_single_config(app: &App, pre_propose: &Addr) -> cppbps::Config { +pub(crate) fn query_pre_proposal_single_config(app: &App, pre_propose: &Addr) -> dpps::Config { app.wrap() - .query_wasm_smart(pre_propose, &cppbps::QueryMsg::Config {}) + .query_wasm_smart(pre_propose, &dpps::QueryMsg::Config {}) .unwrap() } @@ -128,9 +128,9 @@ pub(crate) fn query_pre_proposal_single_deposit_info( app: &App, pre_propose: &Addr, proposal_id: u64, -) -> cppbps::DepositInfoResponse { +) -> dpps::DepositInfoResponse { app.wrap() - .query_wasm_smart(pre_propose, &cppbps::QueryMsg::DepositInfo { proposal_id }) + .query_wasm_smart(pre_propose, &dpps::QueryMsg::DepositInfo { proposal_id }) .unwrap() } diff --git a/contracts/proposal/dao-proposal-single/src/testing/tests.rs b/contracts/proposal/dao-proposal-single/src/testing/tests.rs index 56bc68522..242b84cd7 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/tests.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/tests.rs @@ -16,7 +16,10 @@ use dao_interface::{ state::{Admin, ModuleInstantiateInfo}, voting::InfoResponse, }; -use dao_testing::{ShouldExecute, TestSingleChoiceVote}; +use dao_testing::{ + contracts::{dao_pre_propose_single_contract, dao_proposal_single_contract}, + ShouldExecute, TestSingleChoiceVote, +}; use dao_voting::{ deposit::{CheckedDepositInfo, UncheckedDepositInfo, VotingModuleTokenType}, pre_propose::{PreProposeInfo, PreProposeSubmissionPolicy, ProposalCreationPolicy}, @@ -38,7 +41,6 @@ use crate::{ query::{ProposalResponse, VoteInfo}, state::Config, testing::{ - contracts::{pre_propose_single_contract, proposal_single_contract}, execute::{ add_proposal_hook, add_proposal_hook_should_fail, add_vote_hook, add_vote_hook_should_fail, close_proposal, close_proposal_should_fail, @@ -62,8 +64,8 @@ use crate::{ query_voting_module, }, }, - ContractError, }; +use dao_proposal_single::ContractError; use super::{ do_votes::do_votes_staked_balances, @@ -3092,7 +3094,7 @@ fn test_migrate_from_compatible() { proposal_id: _, } = setup_test(vec![]); - let new_code_id = app.store_code(proposal_single_contract()); + let new_code_id = app.store_code(dao_proposal_single_contract()); let start_config = query_proposal_config(&app, &proposal_module); app.execute( @@ -3154,8 +3156,8 @@ pub fn test_migrate_updates_version() { // let cw20_id = app.store_code(cw20_base_contract()); // let cw20_stake_id = app.store_code(cw20_stake_contract()); -// let staked_balances_voting_id = app.store_code(cw20_staked_balances_voting_contract()); -// let core_contract_id = app.store_code(cw_core_contract()); +// let staked_balances_voting_id = app.store_code(dao_voting_cw20_staked_contract()); +// let core_contract_id = app.store_code(dao_dao_core_contract()); // let instantiate_core = dao_interface::msg::InstantiateMsg { // admin: None, @@ -3278,8 +3280,8 @@ pub fn test_migrate_updates_version() { // ) // .unwrap(); -// let v2_proposal_single = app.store_code(proposal_single_contract()); -// let pre_propose_single = app.store_code(pre_propose_single_contract()); +// let v2_proposal_single = app.store_code(dao_proposal_single_contract()); +// let pre_propose_single = app.store_code(dao_pre_propose_approval_single_contract()); // // Attempt to migrate. This will fail as there is a pending // // proposal. @@ -3754,7 +3756,10 @@ fn test_reply_hooks_mock() { // Do it again. This time, there is no module so this should error. let _id = failed_pre_propose_module_hook_id(); let err = reply(deps.as_mut(), env.clone(), prepropose_reply_msg).unwrap_err(); - assert!(matches!(err, ContractError::InvalidReplyID { id: _ })); + assert!(matches!( + err, + crate::ContractError::InvalidReplyID { id: _ } + )); // Check that we fail open. let status = CREATION_POLICY.load(deps.as_ref().storage).unwrap(); @@ -3933,7 +3938,7 @@ fn test_update_pre_propose_module() { ProposalCreationPolicy::Module { addr } => addr, }; - let pre_propose_id = app.store_code(pre_propose_single_contract()); + let pre_propose_id = app.store_code(dao_pre_propose_single_contract()); // Make a proposal to switch to a new pre-propose moudle. mint_cw20s(&mut app, &gov_token, &core_addr, CREATOR_ADDR, 10_000_000); diff --git a/contracts/staking/cw20-stake-external-rewards/Cargo.toml b/contracts/staking/cw20-stake-external-rewards/Cargo.toml index 9f59c261e..9b14e2bd4 100644 --- a/contracts/staking/cw20-stake-external-rewards/Cargo.toml +++ b/contracts/staking/cw20-stake-external-rewards/Cargo.toml @@ -22,10 +22,10 @@ cw-storage-plus = { workspace = true } cw-controllers = { workspace = true } cw20 = { workspace = true } cw-utils = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true, features = ["library"] } cw2 = { workspace = true } thiserror = { workspace = true } -cw20-stake = { workspace = true, features = ["library"]} +cw20-stake = { workspace = true, features = ["library"] } cw-ownable = { workspace = true } dao-hooks = { workspace = true } @@ -33,5 +33,7 @@ cw20-stake-external-rewards-v1 = { workspace = true } cw20-013 = { package = "cw20", version = "0.13" } [dev-dependencies] +cw20-stake-external-rewards = { workspace = true } cw-multi-test = { workspace = true } anyhow = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/staking/cw20-stake-external-rewards/src/contract.rs b/contracts/staking/cw20-stake-external-rewards/src/contract.rs index e92b0b6d9..2faa57121 100644 --- a/contracts/staking/cw20-stake-external-rewards/src/contract.rs +++ b/contracts/staking/cw20-stake-external-rewards/src/contract.rs @@ -455,1583 +455,3 @@ pub fn query_pending_rewards( last_update_block: LAST_UPDATE_BLOCK.load(deps.storage).unwrap_or_default(), }) } - -#[cfg(test)] -mod tests { - use std::borrow::BorrowMut; - - use crate::{msg::MigrateMsg, ContractError}; - - use cosmwasm_std::{coin, to_json_binary, Addr, Empty, Uint128, WasmMsg}; - use cw20::{Cw20Coin, Cw20ExecuteMsg, Denom}; - use cw_ownable::{Action, Ownership, OwnershipError}; - use cw_utils::Duration; - - use cw_multi_test::{next_block, App, BankSudo, Contract, ContractWrapper, Executor, SudoMsg}; - - use cw20_stake_external_rewards_v1 as v1; - - use crate::msg::{ExecuteMsg, InfoResponse, PendingRewardsResponse, QueryMsg, ReceiveMsg}; - - const OWNER: &str = "owner"; - const ADDR1: &str = "addr0001"; - const ADDR2: &str = "addr0002"; - const ADDR3: &str = "addr0003"; - - pub fn contract_rewards() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_migrate(crate::contract::migrate); - Box::new(contract) - } - - pub fn contract_rewards_v1() -> Box> { - let contract = ContractWrapper::new( - v1::contract::execute, - v1::contract::instantiate, - v1::contract::query, - ); - Box::new(contract) - } - - pub fn contract_staking() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) - } - - pub fn contract_cw20() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) - } - - fn mock_app() -> App { - App::default() - } - - fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { - let cw20_id = app.store_code(contract_cw20()); - let msg = cw20_base::msg::InstantiateMsg { - name: String::from("Test"), - symbol: String::from("TEST"), - decimals: 6, - initial_balances, - mint: None, - marketing: None, - }; - - app.instantiate_contract(cw20_id, Addr::unchecked(ADDR1), &msg, &[], "cw20", None) - .unwrap() - } - - fn instantiate_staking( - app: &mut App, - cw20: Addr, - unstaking_duration: Option, - ) -> Addr { - let staking_code_id = app.store_code(contract_staking()); - let msg = cw20_stake::msg::InstantiateMsg { - owner: Some(OWNER.to_string()), - token_address: cw20.to_string(), - unstaking_duration, - }; - app.instantiate_contract( - staking_code_id, - Addr::unchecked(ADDR1), - &msg, - &[], - "staking", - None, - ) - .unwrap() - } - - fn stake_tokens>( - app: &mut App, - staking_addr: &Addr, - cw20_addr: &Addr, - sender: T, - amount: u128, - ) { - let msg = cw20::Cw20ExecuteMsg::Send { - contract: staking_addr.to_string(), - amount: Uint128::new(amount), - msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), - }; - app.execute_contract(Addr::unchecked(sender), cw20_addr.clone(), &msg, &[]) - .unwrap(); - } - - fn unstake_tokens(app: &mut App, staking_addr: &Addr, address: &str, amount: u128) { - let msg = cw20_stake::msg::ExecuteMsg::Unstake { - amount: Uint128::new(amount), - }; - app.execute_contract(Addr::unchecked(address), staking_addr.clone(), &msg, &[]) - .unwrap(); - } - - fn setup_staking_contract(app: &mut App, initial_balances: Vec) -> (Addr, Addr) { - // Instantiate cw20 contract - let cw20_addr = instantiate_cw20(app, initial_balances.clone()); - app.update_block(next_block); - // Instantiate staking contract - let staking_addr = instantiate_staking(app, cw20_addr.clone(), None); - app.update_block(next_block); - for coin in initial_balances { - stake_tokens( - app, - &staking_addr, - &cw20_addr, - coin.address, - coin.amount.u128(), - ); - } - (staking_addr, cw20_addr) - } - - fn setup_reward_contract( - app: &mut App, - staking_contract: Addr, - reward_token: Denom, - owner: Addr, - ) -> Addr { - let reward_code_id = app.store_code(contract_rewards()); - let msg = crate::msg::InstantiateMsg { - owner: Some(owner.clone().into_string()), - staking_contract: staking_contract.clone().into_string(), - reward_token, - reward_duration: 100000, - }; - let reward_addr = app - .instantiate_contract(reward_code_id, owner, &msg, &[], "reward", None) - .unwrap(); - let msg = cw20_stake::msg::ExecuteMsg::AddHook { - addr: reward_addr.to_string(), - }; - let _result = app - .execute_contract(Addr::unchecked(OWNER), staking_contract, &msg, &[]) - .unwrap(); - reward_addr - } - - fn get_balance_cw20, U: Into>( - app: &App, - contract_addr: T, - address: U, - ) -> Uint128 { - let msg = cw20::Cw20QueryMsg::Balance { - address: address.into(), - }; - let result: cw20::BalanceResponse = - app.wrap().query_wasm_smart(contract_addr, &msg).unwrap(); - result.balance - } - - fn get_balance_native, U: Into>( - app: &App, - address: T, - denom: U, - ) -> Uint128 { - app.wrap().query_balance(address, denom).unwrap().amount - } - - fn get_ownership>(app: &App, address: T) -> Ownership { - app.wrap() - .query_wasm_smart(address, &QueryMsg::Ownership {}) - .unwrap() - } - - fn assert_pending_rewards(app: &mut App, reward_addr: &Addr, address: &str, expected: u128) { - let res: PendingRewardsResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart( - reward_addr, - &QueryMsg::GetPendingRewards { - address: address.to_string(), - }, - ) - .unwrap(); - assert_eq!(res.pending_rewards, Uint128::new(expected)); - } - - fn claim_rewards(app: &mut App, reward_addr: Addr, address: &str) { - let msg = ExecuteMsg::Claim {}; - app.borrow_mut() - .execute_contract(Addr::unchecked(address), reward_addr, &msg, &[]) - .unwrap(); - } - - fn fund_rewards_cw20( - app: &mut App, - admin: &Addr, - reward_token: Addr, - reward_addr: &Addr, - amount: u128, - ) { - let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); - let fund_msg = Cw20ExecuteMsg::Send { - contract: reward_addr.clone().into_string(), - amount: Uint128::new(amount), - msg: fund_sub_msg, - }; - let _res = app - .borrow_mut() - .execute_contract(admin.clone(), reward_token, &fund_msg, &[]) - .unwrap(); - } - - #[test] - fn test_zero_rewards_duration() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let denom = "utest".to_string(); - let (staking_addr, _) = setup_staking_contract(&mut app, vec![]); - let reward_funding = vec![coin(100000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding, - } - })) - .unwrap(); - - let reward_token = Denom::Native(denom); - let owner = admin; - let reward_code_id = app.store_code(contract_rewards()); - let msg = crate::msg::InstantiateMsg { - owner: Some(owner.clone().into_string()), - staking_contract: staking_addr.to_string(), - reward_token, - reward_duration: 0, - }; - let err: ContractError = app - .instantiate_contract(reward_code_id, owner, &msg, &[], "reward", None) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::ZeroRewardDuration {}) - } - - #[test] - fn test_native_rewards() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, cw20_addr) = setup_staking_contract(&mut app, initial_balances); - let reward_funding = vec![coin(100000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let reward_addr = setup_reward_contract( - &mut app, - staking_addr.clone(), - Denom::Native(denom.clone()), - admin.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - let _res = app - .borrow_mut() - .execute_contract( - admin.clone(), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(1000)); - assert_eq!(res.reward.period_finish, 101000); - assert_eq!(res.reward.reward_duration, 100000); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1500); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 750); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 750); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 2000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 1000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 1000); - - assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::zero()); - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::new(2000)); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); - - unstake_tokens(&mut app, &staking_addr, ADDR2, 50); - unstake_tokens(&mut app, &staking_addr, ADDR3, 50); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 15000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::new(17000)); - - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!(get_balance_native(&app, ADDR2, &denom), Uint128::new(3500)); - - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR2, 50); - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 50); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 6000); - - // Current height is 1034. ADDR1 is receiving 500 tokens/block - // and ADDR2 / ADDR3 are receiving 250. - // - // At height 101000 99966 additional blocks have passed. So we - // expect: - // - // ADDR1: 5000 + 99966 * 500 = 49,998,000 - // ADDR2: 2500 + 99966 * 250 = 24,994,000 - // ADDR3: 6000 + 99966 * 250 = 24,997,500 - app.borrow_mut().update_block(|b| b.height = 101000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 49988000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 24994000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 24997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!( - get_balance_native(&app, ADDR1, &denom), - Uint128::new(50005000) - ); - assert_eq!( - get_balance_native(&app, ADDR2, &denom), - Uint128::new(24997500) - ); - assert_eq!(get_balance_native(&app, ADDR3, &denom), Uint128::new(0)); - assert_eq!( - get_balance_native(&app, &reward_addr, &denom), - Uint128::new(24997500) - ); - - app.borrow_mut().update_block(|b| b.height = 200000); - let fund_msg = ExecuteMsg::Fund {}; - - // Add more rewards - let reward_funding = vec![coin(200000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - - let _res = app - .borrow_mut() - .execute_contract( - admin.clone(), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap(); - - app.borrow_mut().update_block(|b| b.height = 300000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 74997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!( - get_balance_native(&app, ADDR1, &denom), - Uint128::new(150005000) - ); - assert_eq!( - get_balance_native(&app, ADDR2, &denom), - Uint128::new(74997500) - ); - assert_eq!(get_balance_native(&app, ADDR3, &denom), Uint128::zero()); - assert_eq!( - get_balance_native(&app, &reward_addr, &denom), - Uint128::new(74997500) - ); - - // Add more rewards - let reward_funding = vec![coin(200000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - - let _res = app - .borrow_mut() - .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) - .unwrap(); - - app.borrow_mut().update_block(|b| b.height = 400000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 124997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - claim_rewards(&mut app, reward_addr.clone(), ADDR3); - assert_eq!( - get_balance_native(&app, ADDR1, &denom), - Uint128::new(250005000) - ); - assert_eq!( - get_balance_native(&app, ADDR2, &denom), - Uint128::new(124997500) - ); - assert_eq!( - get_balance_native(&app, ADDR3, &denom), - Uint128::new(124997500) - ); - assert_eq!( - get_balance_native(&app, &reward_addr, &denom), - Uint128::zero() - ); - - app.borrow_mut().update_block(|b| b.height = 500000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); - - app.borrow_mut().update_block(|b| b.height = 1000000); - unstake_tokens(&mut app, &staking_addr, ADDR3, 1); - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 1); - } - - #[test] - fn test_cw20_rewards() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, cw20_addr) = setup_staking_contract(&mut app, initial_balances); - let reward_token = instantiate_cw20( - &mut app, - vec![Cw20Coin { - address: OWNER.to_string(), - amount: Uint128::new(500000000), - }], - ); - let reward_addr = setup_reward_contract( - &mut app, - staking_addr.clone(), - Denom::Cw20(reward_token.clone()), - admin.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - fund_rewards_cw20( - &mut app, - &admin, - reward_token.clone(), - &reward_addr, - 100000000, - ); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(1000)); - assert_eq!(res.reward.period_finish, 101000); - assert_eq!(res.reward.reward_duration, 100000); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1500); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 750); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 750); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 2000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 1000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 1000); - - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::zero() - ); - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::new(2000) - ); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); - - unstake_tokens(&mut app, &staking_addr, ADDR2, 50); - unstake_tokens(&mut app, &staking_addr, ADDR3, 50); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 15000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::new(17000) - ); - - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR2), - Uint128::new(3500) - ); - - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR2, 50); - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 50); - - app.borrow_mut().update_block(|b| b.height += 10); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 6000); - - app.borrow_mut().update_block(|b| b.height = 101000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 49988000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 24994000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 24997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::new(50005000) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR2), - Uint128::new(24997500) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR3), - Uint128::new(0) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, &reward_addr), - Uint128::new(24997500) - ); - - app.borrow_mut().update_block(|b| b.height = 200000); - - let reward_funding = vec![coin(200000000, denom)]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding, - } - })) - .unwrap(); - - fund_rewards_cw20( - &mut app, - &admin, - reward_token.clone(), - &reward_addr, - 200000000, - ); - - app.borrow_mut().update_block(|b| b.height = 300000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 74997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::new(150005000) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR2), - Uint128::new(74997500) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR3), - Uint128::zero() - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, &reward_addr), - Uint128::new(74997500) - ); - - // Add more rewards - fund_rewards_cw20( - &mut app, - &admin, - reward_token.clone(), - &reward_addr, - 200000000, - ); - - app.borrow_mut().update_block(|b| b.height = 400000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 124997500); - - claim_rewards(&mut app, reward_addr.clone(), ADDR1); - claim_rewards(&mut app, reward_addr.clone(), ADDR2); - claim_rewards(&mut app, reward_addr.clone(), ADDR3); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR1), - Uint128::new(250005000) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR2), - Uint128::new(124997500) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, ADDR3), - Uint128::new(124997500) - ); - assert_eq!( - get_balance_cw20(&app, &reward_token, &reward_addr), - Uint128::zero() - ); - - app.borrow_mut().update_block(|b| b.height = 500000); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); - - app.borrow_mut().update_block(|b| b.height = 1000000); - unstake_tokens(&mut app, &staking_addr, ADDR3, 1); - stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 1); - } - - #[test] - fn update_rewards() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); - let reward_funding = vec![coin(200000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - // Add funding to Addr1 to make sure it can't update staking contract - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: ADDR1.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let reward_addr = setup_reward_contract( - &mut app, - staking_addr, - Denom::Native(denom.clone()), - admin.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - // None admin cannot update rewards - let err: ContractError = app - .borrow_mut() - .execute_contract( - Addr::unchecked(ADDR1), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap_err() - .downcast() - .unwrap(); - - assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); - - let _res = app - .borrow_mut() - .execute_contract( - admin.clone(), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(2000)); - assert_eq!(res.reward.period_finish, 101000); - assert_eq!(res.reward.reward_duration, 100000); - - // Create new period after old period - app.borrow_mut().update_block(|b| b.height = 101000); - - let reward_funding = vec![coin(100000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let _res = app - .borrow_mut() - .execute_contract( - admin.clone(), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(1000)); - assert_eq!(res.reward.period_finish, 201000); - assert_eq!(res.reward.reward_duration, 100000); - - // Add funds in middle of period returns an error - app.borrow_mut().update_block(|b| b.height = 151000); - - let reward_funding = vec![coin(200000000, denom)]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let err = app - .borrow_mut() - .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) - .unwrap_err(); - assert_eq!( - ContractError::RewardPeriodNotFinished {}, - err.downcast().unwrap() - ); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(1000)); - assert_eq!(res.reward.period_finish, 201000); - assert_eq!(res.reward.reward_duration, 100000); - } - - #[test] - fn update_reward_duration() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); - - let reward_addr = setup_reward_contract( - &mut app, - staking_addr, - Denom::Native(denom.clone()), - admin.clone(), - ); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(0)); - assert_eq!(res.reward.period_finish, 0); - assert_eq!(res.reward.reward_duration, 100000); - - // Zero rewards durations are not allowed. - let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 0 }; - let err: ContractError = app - .borrow_mut() - .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::ZeroRewardDuration {}); - - let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 10 }; - let _resp = app - .borrow_mut() - .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(0)); - assert_eq!(res.reward.period_finish, 0); - assert_eq!(res.reward.reward_duration, 10); - - // Non-admin cannot update rewards - let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 100 }; - let err: ContractError = app - .borrow_mut() - .execute_contract(Addr::unchecked("non-admin"), reward_addr.clone(), &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); - - let reward_funding = vec![coin(1000, denom)]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - // Add funding to Addr1 to make sure it can't update staking contract - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: ADDR1.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - let _res = app - .borrow_mut() - .execute_contract( - admin.clone(), - reward_addr.clone(), - &fund_msg, - &reward_funding, - ) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(100)); - assert_eq!(res.reward.period_finish, 1010); - assert_eq!(res.reward.reward_duration, 10); - - // Cannot update reward period before it finishes - let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 10 }; - let err: ContractError = app - .borrow_mut() - .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::RewardPeriodNotFinished {}); - - // Update reward period once rewards are finished - app.borrow_mut().update_block(|b| b.height = 1010); - - let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 100 }; - let _resp = app - .borrow_mut() - .execute_contract(admin, reward_addr.clone(), &msg, &[]) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(100)); - assert_eq!(res.reward.period_finish, 1010); - assert_eq!(res.reward.reward_duration, 100); - } - - #[test] - fn test_update_owner() { - let mut app = mock_app(); - let addr_owner = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); - - let reward_addr = setup_reward_contract( - &mut app, - staking_addr, - Denom::Native(denom), - addr_owner.clone(), - ); - - let owner = get_ownership(&app, &reward_addr).owner; - assert_eq!(owner, Some(addr_owner.clone())); - - // random addr cannot update owner - let msg = ExecuteMsg::UpdateOwnership(Action::TransferOwnership { - new_owner: ADDR1.to_string(), - expiry: None, - }); - let err: ContractError = app - .borrow_mut() - .execute_contract(Addr::unchecked(ADDR1), reward_addr.clone(), &msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); - - // owner nominates a new onwer. - app.borrow_mut() - .execute_contract(addr_owner.clone(), reward_addr.clone(), &msg, &[]) - .unwrap(); - - let ownership = get_ownership(&app, &reward_addr); - assert_eq!( - ownership, - Ownership:: { - owner: Some(addr_owner), - pending_owner: Some(Addr::unchecked(ADDR1)), - pending_expiry: None, - } - ); - - // new owner accepts the nomination. - app.execute_contract( - Addr::unchecked(ADDR1), - reward_addr.clone(), - &ExecuteMsg::UpdateOwnership(Action::AcceptOwnership), - &[], - ) - .unwrap(); - - let ownership = get_ownership(&app, &reward_addr); - assert_eq!( - ownership, - Ownership:: { - owner: Some(Addr::unchecked(ADDR1)), - pending_owner: None, - pending_expiry: None, - } - ); - - // new owner renounces ownership. - app.execute_contract( - Addr::unchecked(ADDR1), - reward_addr.clone(), - &ExecuteMsg::UpdateOwnership(Action::RenounceOwnership), - &[], - ) - .unwrap(); - - let ownership = get_ownership(&app, &reward_addr); - assert_eq!( - ownership, - Ownership:: { - owner: None, - pending_owner: None, - pending_expiry: None, - } - ); - } - - #[test] - fn test_cannot_fund_with_wrong_coin_native() { - let mut app = mock_app(); - let owner = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); - - let reward_addr = setup_reward_contract( - &mut app, - staking_addr, - Denom::Native(denom.clone()), - owner.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - // No funding - let fund_msg = ExecuteMsg::Fund {}; - - let err: ContractError = app - .borrow_mut() - .execute_contract(owner.clone(), reward_addr.clone(), &fund_msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidFunds {}); - - // Invalid funding - let invalid_funding = vec![coin(100, "invalid")]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: owner.to_string(), - amount: invalid_funding.clone(), - } - })) - .unwrap(); - - let fund_msg = ExecuteMsg::Fund {}; - - let err: ContractError = app - .borrow_mut() - .execute_contract( - owner.clone(), - reward_addr.clone(), - &fund_msg, - &invalid_funding, - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidFunds {}); - - // Extra funding - let extra_funding = vec![coin(100, denom), coin(100, "extra")]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: owner.to_string(), - amount: extra_funding.clone(), - } - })) - .unwrap(); - - let fund_msg = ExecuteMsg::Fund {}; - - let err: ContractError = app - .borrow_mut() - .execute_contract( - owner.clone(), - reward_addr.clone(), - &fund_msg, - &extra_funding, - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidFunds {}); - - // Cw20 funding fails - let cw20_token = instantiate_cw20( - &mut app, - vec![Cw20Coin { - address: OWNER.to_string(), - amount: Uint128::new(500000000), - }], - ); - let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); - let fund_msg = Cw20ExecuteMsg::Send { - contract: reward_addr.into_string(), - amount: Uint128::new(100), - msg: fund_sub_msg, - }; - let err: ContractError = app - .borrow_mut() - .execute_contract(owner, cw20_token, &fund_msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidCw20 {}); - } - - #[test] - fn test_cannot_fund_with_wrong_coin_cw20() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let _denom = "utest".to_string(); - let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); - let reward_token = instantiate_cw20( - &mut app, - vec![Cw20Coin { - address: OWNER.to_string(), - amount: Uint128::new(500000000), - }], - ); - let reward_addr = setup_reward_contract( - &mut app, - staking_addr, - Denom::Cw20(Addr::unchecked("dummy_cw20")), - admin.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - // Test with invalid token - let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); - let fund_msg = Cw20ExecuteMsg::Send { - contract: reward_addr.clone().into_string(), - amount: Uint128::new(100), - msg: fund_sub_msg, - }; - let err: ContractError = app - .borrow_mut() - .execute_contract(admin.clone(), reward_token, &fund_msg, &[]) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidCw20 {}); - - // Test does not work when funded with native - let invalid_funding = vec![coin(100, "invalid")]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: invalid_funding.clone(), - } - })) - .unwrap(); - - let fund_msg = ExecuteMsg::Fund {}; - - let err: ContractError = app - .borrow_mut() - .execute_contract(admin, reward_addr, &fund_msg, &invalid_funding) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::InvalidFunds {}) - } - - #[test] - fn test_rewards_with_zero_staked() { - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - // Instantiate cw20 contract - let cw20_addr = instantiate_cw20(&mut app, initial_balances.clone()); - app.update_block(next_block); - // Instantiate staking contract - let staking_addr = instantiate_staking(&mut app, cw20_addr.clone(), None); - app.update_block(next_block); - let reward_funding = vec![coin(100000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let reward_addr = setup_reward_contract( - &mut app, - staking_addr.clone(), - Denom::Native(denom), - admin.clone(), - ); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - let _res = app - .borrow_mut() - .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(1000)); - assert_eq!(res.reward.period_finish, 101000); - assert_eq!(res.reward.reward_duration, 100000); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); - - for coin in initial_balances { - stake_tokens( - &mut app, - &staking_addr, - &cw20_addr, - coin.address, - coin.amount.u128(), - ); - } - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); - } - - #[test] - fn test_small_rewards() { - // This test was added due to a bug in the contract not properly paying out small reward - // amounts due to floor division - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); - let reward_funding = vec![coin(1000000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let reward_addr = - setup_reward_contract(&mut app, staking_addr, Denom::Native(denom), admin.clone()); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - let _res = app - .borrow_mut() - .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) - .unwrap(); - - let res: InfoResponse = app - .borrow_mut() - .wrap() - .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) - .unwrap(); - - assert_eq!(res.reward.reward_rate, Uint128::new(10)); - assert_eq!(res.reward.period_finish, 101000); - assert_eq!(res.reward.reward_duration, 100000); - - app.borrow_mut().update_block(next_block); - assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5); - assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2); - assert_pending_rewards(&mut app, &reward_addr, ADDR3, 2); - } - - #[test] - fn test_zero_reward_rate_failed() { - // This test is due to a bug when funder provides rewards config that results in less then 1 - // reward per block which rounds down to zer0 - let mut app = mock_app(); - let admin = Addr::unchecked(OWNER); - app.borrow_mut().update_block(|b| b.height = 0); - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); - let reward_funding = vec![coin(10000, denom.clone())]; - app.sudo(SudoMsg::Bank({ - BankSudo::Mint { - to_address: admin.to_string(), - amount: reward_funding.clone(), - } - })) - .unwrap(); - let reward_addr = - setup_reward_contract(&mut app, staking_addr, Denom::Native(denom), admin.clone()); - - app.borrow_mut().update_block(|b| b.height = 1000); - - let fund_msg = ExecuteMsg::Fund {}; - - let _res = app - .borrow_mut() - .execute_contract(admin, reward_addr, &fund_msg, &reward_funding) - .unwrap_err(); - } - - #[test] - fn test_migrate_from_v1() { - let mut app = App::default(); - - let v1_code = app.store_code(contract_rewards_v1()); - let v2_code = app.store_code(contract_rewards()); - - let initial_balances = vec![ - Cw20Coin { - address: ADDR1.to_string(), - amount: Uint128::new(100), - }, - Cw20Coin { - address: ADDR2.to_string(), - amount: Uint128::new(50), - }, - Cw20Coin { - address: ADDR3.to_string(), - amount: Uint128::new(50), - }, - ]; - let denom = "utest".to_string(); - let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); - - let rewards_addr = app - .instantiate_contract( - v1_code, - Addr::unchecked(OWNER), - &v1::msg::InstantiateMsg { - owner: Some(OWNER.to_string()), - manager: Some(ADDR1.to_string()), - staking_contract: staking_addr.into_string(), - reward_token: cw20_013::Denom::Native(denom), - reward_duration: 10000, - }, - &[], - "rewards".to_string(), - Some(OWNER.to_string()), - ) - .unwrap(); - - app.execute( - Addr::unchecked(OWNER), - WasmMsg::Migrate { - contract_addr: rewards_addr.to_string(), - new_code_id: v2_code, - msg: to_json_binary(&MigrateMsg::FromV1 {}).unwrap(), - } - .into(), - ) - .unwrap(); - - let ownership = get_ownership(&app, &rewards_addr); - assert_eq!( - ownership, - Ownership:: { - owner: Some(Addr::unchecked(OWNER)), - pending_owner: None, - pending_expiry: None, - } - ); - - let err: ContractError = app - .execute( - Addr::unchecked(OWNER), - WasmMsg::Migrate { - contract_addr: rewards_addr.to_string(), - new_code_id: v2_code, - msg: to_json_binary(&MigrateMsg::FromV1 {}).unwrap(), - } - .into(), - ) - .unwrap_err() - .downcast() - .unwrap(); - assert_eq!(err, ContractError::AlreadyMigrated {}); - } -} diff --git a/contracts/staking/cw20-stake-external-rewards/src/lib.rs b/contracts/staking/cw20-stake-external-rewards/src/lib.rs index 595daabe0..62c64328d 100644 --- a/contracts/staking/cw20-stake-external-rewards/src/lib.rs +++ b/contracts/staking/cw20-stake-external-rewards/src/lib.rs @@ -6,3 +6,6 @@ pub mod msg; pub mod state; pub use crate::error::ContractError; + +#[cfg(test)] +mod tests; diff --git a/contracts/staking/cw20-stake-external-rewards/src/tests.rs b/contracts/staking/cw20-stake-external-rewards/src/tests.rs new file mode 100644 index 000000000..a4f32ae0f --- /dev/null +++ b/contracts/staking/cw20-stake-external-rewards/src/tests.rs @@ -0,0 +1,1537 @@ +use std::borrow::BorrowMut; + +use cosmwasm_std::{coin, to_json_binary, Addr, Uint128, WasmMsg}; +use cw20::{Cw20Coin, Cw20ExecuteMsg, Denom}; +use cw20_stake_external_rewards_v1 as v1; +use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; +use cw_ownable::{Action, Ownership, OwnershipError}; +use cw_utils::Duration; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, cw20_stake_external_rewards_contract, + v1::cw20_stake_external_rewards_v1_contract, +}; + +use crate::msg::{ + ExecuteMsg, InfoResponse, MigrateMsg, PendingRewardsResponse, QueryMsg, ReceiveMsg, +}; +use cw20_stake_external_rewards::ContractError; + +const OWNER: &str = "owner"; +const ADDR1: &str = "addr0001"; +const ADDR2: &str = "addr0002"; +const ADDR3: &str = "addr0003"; + +fn mock_app() -> App { + App::default() +} + +fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { + let cw20_id = app.store_code(cw20_base_contract()); + let msg = cw20_base::msg::InstantiateMsg { + name: String::from("Test"), + symbol: String::from("TEST"), + decimals: 6, + initial_balances, + mint: None, + marketing: None, + }; + + app.instantiate_contract(cw20_id, Addr::unchecked(ADDR1), &msg, &[], "cw20", None) + .unwrap() +} + +fn instantiate_staking(app: &mut App, cw20: Addr, unstaking_duration: Option) -> Addr { + let staking_code_id = app.store_code(cw20_stake_contract()); + let msg = cw20_stake::msg::InstantiateMsg { + owner: Some(OWNER.to_string()), + token_address: cw20.to_string(), + unstaking_duration, + }; + app.instantiate_contract( + staking_code_id, + Addr::unchecked(ADDR1), + &msg, + &[], + "staking", + None, + ) + .unwrap() +} + +fn stake_tokens>( + app: &mut App, + staking_addr: &Addr, + cw20_addr: &Addr, + sender: T, + amount: u128, +) { + let msg = cw20::Cw20ExecuteMsg::Send { + contract: staking_addr.to_string(), + amount: Uint128::new(amount), + msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), + }; + app.execute_contract(Addr::unchecked(sender), cw20_addr.clone(), &msg, &[]) + .unwrap(); +} + +fn unstake_tokens(app: &mut App, staking_addr: &Addr, address: &str, amount: u128) { + let msg = cw20_stake::msg::ExecuteMsg::Unstake { + amount: Uint128::new(amount), + }; + app.execute_contract(Addr::unchecked(address), staking_addr.clone(), &msg, &[]) + .unwrap(); +} + +fn setup_staking_contract(app: &mut App, initial_balances: Vec) -> (Addr, Addr) { + // Instantiate cw20 contract + let cw20_addr = instantiate_cw20(app, initial_balances.clone()); + app.update_block(next_block); + // Instantiate staking contract + let staking_addr = instantiate_staking(app, cw20_addr.clone(), None); + app.update_block(next_block); + for coin in initial_balances { + stake_tokens( + app, + &staking_addr, + &cw20_addr, + coin.address, + coin.amount.u128(), + ); + } + (staking_addr, cw20_addr) +} + +fn setup_reward_contract( + app: &mut App, + staking_contract: Addr, + reward_token: Denom, + owner: Addr, +) -> Addr { + let reward_code_id = app.store_code(cw20_stake_external_rewards_contract()); + let msg = crate::msg::InstantiateMsg { + owner: Some(owner.clone().into_string()), + staking_contract: staking_contract.clone().into_string(), + reward_token, + reward_duration: 100000, + }; + let reward_addr = app + .instantiate_contract(reward_code_id, owner, &msg, &[], "reward", None) + .unwrap(); + let msg = cw20_stake::msg::ExecuteMsg::AddHook { + addr: reward_addr.to_string(), + }; + let _result = app + .execute_contract(Addr::unchecked(OWNER), staking_contract, &msg, &[]) + .unwrap(); + reward_addr +} + +fn get_balance_cw20, U: Into>( + app: &App, + contract_addr: T, + address: U, +) -> Uint128 { + let msg = cw20::Cw20QueryMsg::Balance { + address: address.into(), + }; + let result: cw20::BalanceResponse = app.wrap().query_wasm_smart(contract_addr, &msg).unwrap(); + result.balance +} + +fn get_balance_native, U: Into>( + app: &App, + address: T, + denom: U, +) -> Uint128 { + app.wrap().query_balance(address, denom).unwrap().amount +} + +fn get_ownership>(app: &App, address: T) -> Ownership { + app.wrap() + .query_wasm_smart(address, &QueryMsg::Ownership {}) + .unwrap() +} + +fn assert_pending_rewards(app: &mut App, reward_addr: &Addr, address: &str, expected: u128) { + let res: PendingRewardsResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart( + reward_addr, + &QueryMsg::GetPendingRewards { + address: address.to_string(), + }, + ) + .unwrap(); + assert_eq!(res.pending_rewards, Uint128::new(expected)); +} + +fn claim_rewards(app: &mut App, reward_addr: Addr, address: &str) { + let msg = ExecuteMsg::Claim {}; + app.borrow_mut() + .execute_contract(Addr::unchecked(address), reward_addr, &msg, &[]) + .unwrap(); +} + +fn fund_rewards_cw20( + app: &mut App, + admin: &Addr, + reward_token: Addr, + reward_addr: &Addr, + amount: u128, +) { + let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); + let fund_msg = Cw20ExecuteMsg::Send { + contract: reward_addr.clone().into_string(), + amount: Uint128::new(amount), + msg: fund_sub_msg, + }; + let _res = app + .borrow_mut() + .execute_contract(admin.clone(), reward_token, &fund_msg, &[]) + .unwrap(); +} + +#[test] +fn test_zero_rewards_duration() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let denom = "utest".to_string(); + let (staking_addr, _) = setup_staking_contract(&mut app, vec![]); + let reward_funding = vec![coin(100000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding, + } + })) + .unwrap(); + + let reward_token = Denom::Native(denom); + let owner = admin; + let reward_code_id = app.store_code(cw20_stake_external_rewards_contract()); + let msg = crate::msg::InstantiateMsg { + owner: Some(owner.clone().into_string()), + staking_contract: staking_addr.to_string(), + reward_token, + reward_duration: 0, + }; + let err: ContractError = app + .instantiate_contract(reward_code_id, owner, &msg, &[], "reward", None) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::ZeroRewardDuration {}) +} + +#[test] +fn test_native_rewards() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, cw20_addr) = setup_staking_contract(&mut app, initial_balances); + let reward_funding = vec![coin(100000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let reward_addr = setup_reward_contract( + &mut app, + staking_addr.clone(), + Denom::Native(denom.clone()), + admin.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + let _res = app + .borrow_mut() + .execute_contract( + admin.clone(), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(1000)); + assert_eq!(res.reward.period_finish, 101000); + assert_eq!(res.reward.reward_duration, 100000); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1500); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 750); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 750); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 2000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 1000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 1000); + + assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::zero()); + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::new(2000)); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); + + unstake_tokens(&mut app, &staking_addr, ADDR2, 50); + unstake_tokens(&mut app, &staking_addr, ADDR3, 50); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 15000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + assert_eq!(get_balance_native(&app, ADDR1, &denom), Uint128::new(17000)); + + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!(get_balance_native(&app, ADDR2, &denom), Uint128::new(3500)); + + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR2, 50); + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 50); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 6000); + + // Current height is 1034. ADDR1 is receiving 500 tokens/block + // and ADDR2 / ADDR3 are receiving 250. + // + // At height 101000 99966 additional blocks have passed. So we + // expect: + // + // ADDR1: 5000 + 99966 * 500 = 49,998,000 + // ADDR2: 2500 + 99966 * 250 = 24,994,000 + // ADDR3: 6000 + 99966 * 250 = 24,997,500 + app.borrow_mut().update_block(|b| b.height = 101000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 49988000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 24994000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 24997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!( + get_balance_native(&app, ADDR1, &denom), + Uint128::new(50005000) + ); + assert_eq!( + get_balance_native(&app, ADDR2, &denom), + Uint128::new(24997500) + ); + assert_eq!(get_balance_native(&app, ADDR3, &denom), Uint128::new(0)); + assert_eq!( + get_balance_native(&app, &reward_addr, &denom), + Uint128::new(24997500) + ); + + app.borrow_mut().update_block(|b| b.height = 200000); + let fund_msg = ExecuteMsg::Fund {}; + + // Add more rewards + let reward_funding = vec![coin(200000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + + let _res = app + .borrow_mut() + .execute_contract( + admin.clone(), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap(); + + app.borrow_mut().update_block(|b| b.height = 300000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 74997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!( + get_balance_native(&app, ADDR1, &denom), + Uint128::new(150005000) + ); + assert_eq!( + get_balance_native(&app, ADDR2, &denom), + Uint128::new(74997500) + ); + assert_eq!(get_balance_native(&app, ADDR3, &denom), Uint128::zero()); + assert_eq!( + get_balance_native(&app, &reward_addr, &denom), + Uint128::new(74997500) + ); + + // Add more rewards + let reward_funding = vec![coin(200000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + + let _res = app + .borrow_mut() + .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) + .unwrap(); + + app.borrow_mut().update_block(|b| b.height = 400000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 124997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + claim_rewards(&mut app, reward_addr.clone(), ADDR3); + assert_eq!( + get_balance_native(&app, ADDR1, &denom), + Uint128::new(250005000) + ); + assert_eq!( + get_balance_native(&app, ADDR2, &denom), + Uint128::new(124997500) + ); + assert_eq!( + get_balance_native(&app, ADDR3, &denom), + Uint128::new(124997500) + ); + assert_eq!( + get_balance_native(&app, &reward_addr, &denom), + Uint128::zero() + ); + + app.borrow_mut().update_block(|b| b.height = 500000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); + + app.borrow_mut().update_block(|b| b.height = 1000000); + unstake_tokens(&mut app, &staking_addr, ADDR3, 1); + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 1); +} + +#[test] +fn test_cw20_rewards() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, cw20_addr) = setup_staking_contract(&mut app, initial_balances); + let reward_token = instantiate_cw20( + &mut app, + vec![Cw20Coin { + address: OWNER.to_string(), + amount: Uint128::new(500000000), + }], + ); + let reward_addr = setup_reward_contract( + &mut app, + staking_addr.clone(), + Denom::Cw20(reward_token.clone()), + admin.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + fund_rewards_cw20( + &mut app, + &admin, + reward_token.clone(), + &reward_addr, + 100000000, + ); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(1000)); + assert_eq!(res.reward.period_finish, 101000); + assert_eq!(res.reward.reward_duration, 100000); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1500); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 750); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 750); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 2000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 1000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 1000); + + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::zero() + ); + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::new(2000) + ); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); + + unstake_tokens(&mut app, &staking_addr, ADDR2, 50); + unstake_tokens(&mut app, &staking_addr, ADDR3, 50); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 15000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 3500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 3500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::new(17000) + ); + + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR2), + Uint128::new(3500) + ); + + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR2, 50); + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 50); + + app.borrow_mut().update_block(|b| b.height += 10); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 6000); + + app.borrow_mut().update_block(|b| b.height = 101000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 49988000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 24994000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 24997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::new(50005000) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR2), + Uint128::new(24997500) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR3), + Uint128::new(0) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, &reward_addr), + Uint128::new(24997500) + ); + + app.borrow_mut().update_block(|b| b.height = 200000); + + let reward_funding = vec![coin(200000000, denom)]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding, + } + })) + .unwrap(); + + fund_rewards_cw20( + &mut app, + &admin, + reward_token.clone(), + &reward_addr, + 200000000, + ); + + app.borrow_mut().update_block(|b| b.height = 300000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 74997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::new(150005000) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR2), + Uint128::new(74997500) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR3), + Uint128::zero() + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, &reward_addr), + Uint128::new(74997500) + ); + + // Add more rewards + fund_rewards_cw20( + &mut app, + &admin, + reward_token.clone(), + &reward_addr, + 200000000, + ); + + app.borrow_mut().update_block(|b| b.height = 400000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 100000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 50000000); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 124997500); + + claim_rewards(&mut app, reward_addr.clone(), ADDR1); + claim_rewards(&mut app, reward_addr.clone(), ADDR2); + claim_rewards(&mut app, reward_addr.clone(), ADDR3); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR1), + Uint128::new(250005000) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR2), + Uint128::new(124997500) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, ADDR3), + Uint128::new(124997500) + ); + assert_eq!( + get_balance_cw20(&app, &reward_token, &reward_addr), + Uint128::zero() + ); + + app.borrow_mut().update_block(|b| b.height = 500000); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); + + app.borrow_mut().update_block(|b| b.height = 1000000); + unstake_tokens(&mut app, &staking_addr, ADDR3, 1); + stake_tokens(&mut app, &staking_addr, &cw20_addr, ADDR3, 1); +} + +#[test] +fn update_rewards() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); + let reward_funding = vec![coin(200000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + // Add funding to Addr1 to make sure it can't update staking contract + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: ADDR1.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let reward_addr = setup_reward_contract( + &mut app, + staking_addr, + Denom::Native(denom.clone()), + admin.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + // None admin cannot update rewards + let err: ContractError = app + .borrow_mut() + .execute_contract( + Addr::unchecked(ADDR1), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap_err() + .downcast() + .unwrap(); + + assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); + + let _res = app + .borrow_mut() + .execute_contract( + admin.clone(), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(2000)); + assert_eq!(res.reward.period_finish, 101000); + assert_eq!(res.reward.reward_duration, 100000); + + // Create new period after old period + app.borrow_mut().update_block(|b| b.height = 101000); + + let reward_funding = vec![coin(100000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let _res = app + .borrow_mut() + .execute_contract( + admin.clone(), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(1000)); + assert_eq!(res.reward.period_finish, 201000); + assert_eq!(res.reward.reward_duration, 100000); + + // Add funds in middle of period returns an error + app.borrow_mut().update_block(|b| b.height = 151000); + + let reward_funding = vec![coin(200000000, denom)]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let err = app + .borrow_mut() + .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) + .unwrap_err(); + assert_eq!( + ContractError::RewardPeriodNotFinished {}, + err.downcast().unwrap() + ); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(1000)); + assert_eq!(res.reward.period_finish, 201000); + assert_eq!(res.reward.reward_duration, 100000); +} + +#[test] +fn update_reward_duration() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); + + let reward_addr = setup_reward_contract( + &mut app, + staking_addr, + Denom::Native(denom.clone()), + admin.clone(), + ); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(0)); + assert_eq!(res.reward.period_finish, 0); + assert_eq!(res.reward.reward_duration, 100000); + + // Zero rewards durations are not allowed. + let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 0 }; + let err: ContractError = app + .borrow_mut() + .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::ZeroRewardDuration {}); + + let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 10 }; + let _resp = app + .borrow_mut() + .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(0)); + assert_eq!(res.reward.period_finish, 0); + assert_eq!(res.reward.reward_duration, 10); + + // Non-admin cannot update rewards + let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 100 }; + let err: ContractError = app + .borrow_mut() + .execute_contract(Addr::unchecked("non-admin"), reward_addr.clone(), &msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); + + let reward_funding = vec![coin(1000, denom)]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + // Add funding to Addr1 to make sure it can't update staking contract + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: ADDR1.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + let _res = app + .borrow_mut() + .execute_contract( + admin.clone(), + reward_addr.clone(), + &fund_msg, + &reward_funding, + ) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(100)); + assert_eq!(res.reward.period_finish, 1010); + assert_eq!(res.reward.reward_duration, 10); + + // Cannot update reward period before it finishes + let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 10 }; + let err: ContractError = app + .borrow_mut() + .execute_contract(admin.clone(), reward_addr.clone(), &msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::RewardPeriodNotFinished {}); + + // Update reward period once rewards are finished + app.borrow_mut().update_block(|b| b.height = 1010); + + let msg = ExecuteMsg::UpdateRewardDuration { new_duration: 100 }; + let _resp = app + .borrow_mut() + .execute_contract(admin, reward_addr.clone(), &msg, &[]) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(100)); + assert_eq!(res.reward.period_finish, 1010); + assert_eq!(res.reward.reward_duration, 100); +} + +#[test] +fn test_update_owner() { + let mut app = mock_app(); + let addr_owner = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); + + let reward_addr = setup_reward_contract( + &mut app, + staking_addr, + Denom::Native(denom), + addr_owner.clone(), + ); + + let owner = get_ownership(&app, &reward_addr).owner; + assert_eq!(owner, Some(addr_owner.clone())); + + // random addr cannot update owner + let msg = ExecuteMsg::UpdateOwnership(Action::TransferOwnership { + new_owner: ADDR1.to_string(), + expiry: None, + }); + let err: ContractError = app + .borrow_mut() + .execute_contract(Addr::unchecked(ADDR1), reward_addr.clone(), &msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); + + // owner nominates a new onwer. + app.borrow_mut() + .execute_contract(addr_owner.clone(), reward_addr.clone(), &msg, &[]) + .unwrap(); + + let ownership = get_ownership(&app, &reward_addr); + assert_eq!( + ownership, + Ownership:: { + owner: Some(addr_owner), + pending_owner: Some(Addr::unchecked(ADDR1)), + pending_expiry: None, + } + ); + + // new owner accepts the nomination. + app.execute_contract( + Addr::unchecked(ADDR1), + reward_addr.clone(), + &ExecuteMsg::UpdateOwnership(Action::AcceptOwnership), + &[], + ) + .unwrap(); + + let ownership = get_ownership(&app, &reward_addr); + assert_eq!( + ownership, + Ownership:: { + owner: Some(Addr::unchecked(ADDR1)), + pending_owner: None, + pending_expiry: None, + } + ); + + // new owner renounces ownership. + app.execute_contract( + Addr::unchecked(ADDR1), + reward_addr.clone(), + &ExecuteMsg::UpdateOwnership(Action::RenounceOwnership), + &[], + ) + .unwrap(); + + let ownership = get_ownership(&app, &reward_addr); + assert_eq!( + ownership, + Ownership:: { + owner: None, + pending_owner: None, + pending_expiry: None, + } + ); +} + +#[test] +fn test_cannot_fund_with_wrong_coin_native() { + let mut app = mock_app(); + let owner = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); + + let reward_addr = setup_reward_contract( + &mut app, + staking_addr, + Denom::Native(denom.clone()), + owner.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + // No funding + let fund_msg = ExecuteMsg::Fund {}; + + let err: ContractError = app + .borrow_mut() + .execute_contract(owner.clone(), reward_addr.clone(), &fund_msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidFunds {}); + + // Invalid funding + let invalid_funding = vec![coin(100, "invalid")]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: owner.to_string(), + amount: invalid_funding.clone(), + } + })) + .unwrap(); + + let fund_msg = ExecuteMsg::Fund {}; + + let err: ContractError = app + .borrow_mut() + .execute_contract( + owner.clone(), + reward_addr.clone(), + &fund_msg, + &invalid_funding, + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidFunds {}); + + // Extra funding + let extra_funding = vec![coin(100, denom), coin(100, "extra")]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: owner.to_string(), + amount: extra_funding.clone(), + } + })) + .unwrap(); + + let fund_msg = ExecuteMsg::Fund {}; + + let err: ContractError = app + .borrow_mut() + .execute_contract( + owner.clone(), + reward_addr.clone(), + &fund_msg, + &extra_funding, + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidFunds {}); + + // Cw20 funding fails + let cw20_token = instantiate_cw20( + &mut app, + vec![Cw20Coin { + address: OWNER.to_string(), + amount: Uint128::new(500000000), + }], + ); + let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); + let fund_msg = Cw20ExecuteMsg::Send { + contract: reward_addr.into_string(), + amount: Uint128::new(100), + msg: fund_sub_msg, + }; + let err: ContractError = app + .borrow_mut() + .execute_contract(owner, cw20_token, &fund_msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidCw20 {}); +} + +#[test] +fn test_cannot_fund_with_wrong_coin_cw20() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let _denom = "utest".to_string(); + let (staking_addr, _cw20_addr) = setup_staking_contract(&mut app, initial_balances); + let reward_token = instantiate_cw20( + &mut app, + vec![Cw20Coin { + address: OWNER.to_string(), + amount: Uint128::new(500000000), + }], + ); + let reward_addr = setup_reward_contract( + &mut app, + staking_addr, + Denom::Cw20(Addr::unchecked("dummy_cw20")), + admin.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + // Test with invalid token + let fund_sub_msg = to_json_binary(&ReceiveMsg::Fund {}).unwrap(); + let fund_msg = Cw20ExecuteMsg::Send { + contract: reward_addr.clone().into_string(), + amount: Uint128::new(100), + msg: fund_sub_msg, + }; + let err: ContractError = app + .borrow_mut() + .execute_contract(admin.clone(), reward_token, &fund_msg, &[]) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidCw20 {}); + + // Test does not work when funded with native + let invalid_funding = vec![coin(100, "invalid")]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: invalid_funding.clone(), + } + })) + .unwrap(); + + let fund_msg = ExecuteMsg::Fund {}; + + let err: ContractError = app + .borrow_mut() + .execute_contract(admin, reward_addr, &fund_msg, &invalid_funding) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::InvalidFunds {}) +} + +#[test] +fn test_rewards_with_zero_staked() { + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + // Instantiate cw20 contract + let cw20_addr = instantiate_cw20(&mut app, initial_balances.clone()); + app.update_block(next_block); + // Instantiate staking contract + let staking_addr = instantiate_staking(&mut app, cw20_addr.clone(), None); + app.update_block(next_block); + let reward_funding = vec![coin(100000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let reward_addr = setup_reward_contract( + &mut app, + staking_addr.clone(), + Denom::Native(denom), + admin.clone(), + ); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + let _res = app + .borrow_mut() + .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(1000)); + assert_eq!(res.reward.period_finish, 101000); + assert_eq!(res.reward.reward_duration, 100000); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 0); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 0); + + for coin in initial_balances { + stake_tokens( + &mut app, + &staking_addr, + &cw20_addr, + coin.address, + coin.amount.u128(), + ); + } + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 250); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 250); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 1000); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 500); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 500); +} + +#[test] +fn test_small_rewards() { + // This test was added due to a bug in the contract not properly paying out small reward + // amounts due to floor division + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); + let reward_funding = vec![coin(1000000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let reward_addr = + setup_reward_contract(&mut app, staking_addr, Denom::Native(denom), admin.clone()); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + let _res = app + .borrow_mut() + .execute_contract(admin, reward_addr.clone(), &fund_msg, &reward_funding) + .unwrap(); + + let res: InfoResponse = app + .borrow_mut() + .wrap() + .query_wasm_smart(&reward_addr, &QueryMsg::Info {}) + .unwrap(); + + assert_eq!(res.reward.reward_rate, Uint128::new(10)); + assert_eq!(res.reward.period_finish, 101000); + assert_eq!(res.reward.reward_duration, 100000); + + app.borrow_mut().update_block(next_block); + assert_pending_rewards(&mut app, &reward_addr, ADDR1, 5); + assert_pending_rewards(&mut app, &reward_addr, ADDR2, 2); + assert_pending_rewards(&mut app, &reward_addr, ADDR3, 2); +} + +#[test] +fn test_zero_reward_rate_failed() { + // This test is due to a bug when funder provides rewards config that results in less then 1 + // reward per block which rounds down to zer0 + let mut app = mock_app(); + let admin = Addr::unchecked(OWNER); + app.borrow_mut().update_block(|b| b.height = 0); + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); + let reward_funding = vec![coin(10000, denom.clone())]; + app.sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: admin.to_string(), + amount: reward_funding.clone(), + } + })) + .unwrap(); + let reward_addr = + setup_reward_contract(&mut app, staking_addr, Denom::Native(denom), admin.clone()); + + app.borrow_mut().update_block(|b| b.height = 1000); + + let fund_msg = ExecuteMsg::Fund {}; + + let _res = app + .borrow_mut() + .execute_contract(admin, reward_addr, &fund_msg, &reward_funding) + .unwrap_err(); +} + +#[test] +fn test_migrate_from_v1() { + let mut app = App::default(); + + let v1_code = app.store_code(cw20_stake_external_rewards_v1_contract()); + let v2_code = app.store_code(cw20_stake_external_rewards_contract()); + + let initial_balances = vec![ + Cw20Coin { + address: ADDR1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: ADDR2.to_string(), + amount: Uint128::new(50), + }, + Cw20Coin { + address: ADDR3.to_string(), + amount: Uint128::new(50), + }, + ]; + let denom = "utest".to_string(); + let (staking_addr, _) = setup_staking_contract(&mut app, initial_balances); + + let rewards_addr = app + .instantiate_contract( + v1_code, + Addr::unchecked(OWNER), + &v1::msg::InstantiateMsg { + owner: Some(OWNER.to_string()), + manager: Some(ADDR1.to_string()), + staking_contract: staking_addr.into_string(), + reward_token: cw20_013::Denom::Native(denom), + reward_duration: 10000, + }, + &[], + "rewards".to_string(), + Some(OWNER.to_string()), + ) + .unwrap(); + + app.execute( + Addr::unchecked(OWNER), + WasmMsg::Migrate { + contract_addr: rewards_addr.to_string(), + new_code_id: v2_code, + msg: to_json_binary(&MigrateMsg::FromV1 {}).unwrap(), + } + .into(), + ) + .unwrap(); + + let ownership = get_ownership(&app, &rewards_addr); + assert_eq!( + ownership, + Ownership:: { + owner: Some(Addr::unchecked(OWNER)), + pending_owner: None, + pending_expiry: None, + } + ); + + let err: ContractError = app + .execute( + Addr::unchecked(OWNER), + WasmMsg::Migrate { + contract_addr: rewards_addr.to_string(), + new_code_id: v2_code, + msg: to_json_binary(&MigrateMsg::FromV1 {}).unwrap(), + } + .into(), + ) + .unwrap_err() + .downcast() + .unwrap(); + assert_eq!(err, ContractError::AlreadyMigrated {}); +} diff --git a/contracts/staking/cw20-stake-reward-distributor/Cargo.toml b/contracts/staking/cw20-stake-reward-distributor/Cargo.toml index 75972d965..4ce8abc3a 100644 --- a/contracts/staking/cw20-stake-reward-distributor/Cargo.toml +++ b/contracts/staking/cw20-stake-reward-distributor/Cargo.toml @@ -1,7 +1,9 @@ [package] name = "cw20-stake-reward-distributor" edition = "2018" -authors = ["Vernon Johnson , ekez "] +authors = [ + "Vernon Johnson , ekez ", +] description = "Distributes cw20 staking rewards." license = { workspace = true } repository = { workspace = true } @@ -24,11 +26,13 @@ cw-storage-plus = { workspace = true } cw2 = { workspace = true } cw20 = { workspace = true } cw-utils = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } -cw20-stake = { workspace = true, features = ["library"]} +cw20-base = { workspace = true, features = ["library"] } +cw20-stake = { workspace = true, features = ["library"] } thiserror = { workspace = true } cw-ownable = { workspace = true } cw20-stake-reward-distributor-v1 = { workspace = true, features = ["library"] } [dev-dependencies] +cw20-stake-reward-distributor = { workspace = true } cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/staking/cw20-stake-reward-distributor/src/tests.rs b/contracts/staking/cw20-stake-reward-distributor/src/tests.rs index 7b6bde529..231e4e33a 100644 --- a/contracts/staking/cw20-stake-reward-distributor/src/tests.rs +++ b/contracts/staking/cw20-stake-reward-distributor/src/tests.rs @@ -1,58 +1,24 @@ +use cosmwasm_std::{to_json_binary, Addr, Uint128, WasmMsg}; +use cw20::Cw20Coin; +use cw20_stake_reward_distributor_v1 as v1; +use cw_multi_test::{next_block, App, Executor}; +use cw_ownable::{Action, Expiration, Ownership, OwnershipError}; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, cw20_stake_reward_distributor_contract, + v1::cw20_stake_reward_distributor_v1_contract, +}; + use crate::{ msg::{ExecuteMsg, InfoResponse, InstantiateMsg, MigrateMsg, QueryMsg}, state::Config, - ContractError, }; - -use cw20_stake_reward_distributor_v1 as v1; - -use cosmwasm_std::{to_json_binary, Addr, Empty, Uint128, WasmMsg}; -use cw20::Cw20Coin; -use cw_multi_test::{next_block, App, Contract, ContractWrapper, Executor}; -use cw_ownable::{Action, Expiration, Ownership, OwnershipError}; +use cw20_stake_reward_distributor::ContractError; const OWNER: &str = "owner"; const OWNER2: &str = "owner2"; -pub fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn staking_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - -fn distributor_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn distributor_contract_v1() -> Box> { - let contract = ContractWrapper::new( - v1::contract::execute, - v1::contract::instantiate, - v1::contract::query, - ); - Box::new(contract) -} - fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { - let cw20_id = app.store_code(cw20_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let msg = cw20_base::msg::InstantiateMsg { name: String::from("Test"), symbol: String::from("TEST"), @@ -67,7 +33,7 @@ fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { } fn instantiate_staking(app: &mut App, cw20_addr: Addr) -> Addr { - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(cw20_stake_contract()); let msg = cw20_stake::msg::InstantiateMsg { owner: Some(OWNER.to_string()), token_address: cw20_addr.to_string(), @@ -85,7 +51,7 @@ fn instantiate_staking(app: &mut App, cw20_addr: Addr) -> Addr { } fn instantiate_distributor(app: &mut App, msg: InstantiateMsg) -> Addr { - let code_id = app.store_code(distributor_contract()); + let code_id = app.store_code(cw20_stake_reward_distributor_contract()); app.instantiate_contract( code_id, Addr::unchecked(OWNER), @@ -351,7 +317,7 @@ fn test_instantiate_invalid_addrs() { reward_token: "invalid_cw20".to_string(), }; - let code_id = app.store_code(distributor_contract()); + let code_id = app.store_code(cw20_stake_reward_distributor_contract()); let err: ContractError = app .instantiate_contract( code_id, @@ -689,8 +655,8 @@ fn test_migrate_from_v1() { ); let staking_addr = instantiate_staking(&mut app, cw20_addr.clone()); - let v1_code = app.store_code(distributor_contract_v1()); - let v2_code = app.store_code(distributor_contract()); + let v1_code = app.store_code(cw20_stake_reward_distributor_v1_contract()); + let v2_code = app.store_code(cw20_stake_reward_distributor_contract()); let distributor = app .instantiate_contract( v1_code, diff --git a/contracts/staking/cw20-stake/Cargo.toml b/contracts/staking/cw20-stake/Cargo.toml index 4417b372b..de04b0fb2 100644 --- a/contracts/staking/cw20-stake/Cargo.toml +++ b/contracts/staking/cw20-stake/Cargo.toml @@ -35,5 +35,7 @@ cw20-stake-v1 = { workspace = true, features = ["library"] } cw-utils-v1 = { workspace = true } [dev-dependencies] +cw20-stake = { workspace = true } cw-multi-test = { workspace = true } anyhow = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/staking/cw20-stake/src/tests.rs b/contracts/staking/cw20-stake/src/tests.rs index 147bd806f..72a1f1b73 100644 --- a/contracts/staking/cw20-stake/src/tests.rs +++ b/contracts/staking/cw20-stake/src/tests.rs @@ -1,12 +1,13 @@ use anyhow::Result as AnyResult; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; -use cosmwasm_std::{to_json_binary, Addr, Empty, MessageInfo, Uint128, WasmMsg}; +use cosmwasm_std::{to_json_binary, Addr, MessageInfo, Uint128, WasmMsg}; use cw20::Cw20Coin; use cw_controllers::{Claim, ClaimsResponse}; -use cw_multi_test::{next_block, App, AppResponse, Contract, ContractWrapper, Executor}; +use cw_multi_test::{next_block, App, AppResponse, Executor}; use cw_ownable::{Action, Ownership, OwnershipError}; use cw_utils::Duration; use cw_utils::Expiration::AtHeight; +use dao_testing::contracts::{cw20_base_contract, cw20_stake_contract, v1::cw20_stake_v1_contract}; use dao_voting::duration::UnstakingDurationError; use std::borrow::BorrowMut; @@ -16,7 +17,7 @@ use crate::msg::{ TotalStakedAtHeightResponse, TotalValueResponse, }; use crate::state::{Config, MAX_CLAIMS}; -use crate::ContractError; +use cw20_stake::ContractError; use cw20_stake_v1 as v1; @@ -26,35 +27,6 @@ const ADDR3: &str = "addr0003"; const ADDR4: &str = "addr0004"; const OWNER: &str = "owner"; -fn contract_staking() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - -fn contract_staking_v1() -> Box> { - let contract = ContractWrapper::new( - v1::contract::execute, - v1::contract::instantiate, - v1::contract::query, - ) - .with_migrate(v1::contract::migrate); - Box::new(contract) -} - -fn contract_cw20() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - fn mock_app() -> App { App::default() } @@ -72,7 +44,7 @@ fn get_balance, U: Into>( } fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { - let cw20_id = app.store_code(contract_cw20()); + let cw20_id = app.store_code(cw20_base_contract()); let msg = cw20_base::msg::InstantiateMsg { name: String::from("Test"), symbol: String::from("TEST"), @@ -87,7 +59,7 @@ fn instantiate_cw20(app: &mut App, initial_balances: Vec) -> Addr { } fn instantiate_staking(app: &mut App, cw20: Addr, unstaking_duration: Option) -> Addr { - let staking_code_id = app.store_code(contract_staking()); + let staking_code_id = app.store_code(cw20_stake_contract()); let msg = crate::msg::InstantiateMsg { owner: Some(OWNER.to_string()), token_address: cw20.to_string(), @@ -1127,8 +1099,8 @@ fn test_migrate_from_v1() { }], ); - let v1_code = app.store_code(contract_staking_v1()); - let v2_code = app.store_code(contract_staking()); + let v1_code = app.store_code(cw20_stake_v1_contract()); + let v2_code = app.store_code(cw20_stake_contract()); let staking = app .instantiate_contract( diff --git a/contracts/test/dao-proposal-hook-counter/Cargo.toml b/contracts/test/dao-proposal-hook-counter/Cargo.toml index 395fb338a..9ac82759a 100644 --- a/contracts/test/dao-proposal-hook-counter/Cargo.toml +++ b/contracts/test/dao-proposal-hook-counter/Cargo.toml @@ -35,3 +35,4 @@ dao-interface = { workspace = true } dao-dao-core = { workspace = true } dao-proposal-single = { workspace = true } cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/test/dao-proposal-hook-counter/src/tests.rs b/contracts/test/dao-proposal-hook-counter/src/tests.rs index 611c22dad..e28ed1b34 100644 --- a/contracts/test/dao-proposal-hook-counter/src/tests.rs +++ b/contracts/test/dao-proposal-hook-counter/src/tests.rs @@ -1,10 +1,13 @@ -use cosmwasm_std::{to_json_binary, Addr, Empty, Uint128}; +use cosmwasm_std::{to_json_binary, Addr, Uint128}; use cw20::Cw20Coin; use cw_hooks::HooksResponse; -use cw_multi_test::{App, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, Executor}; use dao_interface::state::ProposalModule; use dao_interface::state::{Admin, ModuleInstantiateInfo}; - +use dao_testing::contracts::{ + cw20_base_contract, dao_dao_core_contract, dao_proposal_hook_counter_contract, + dao_proposal_single_contract, dao_voting_cw20_balance_contract, +}; use dao_voting::{ pre_propose::PreProposeInfo, threshold::{PercentageThreshold, Threshold}, @@ -17,54 +20,6 @@ use dao_voting::proposal::SingleChoiceProposeMsg as ProposeMsg; const CREATOR_ADDR: &str = "creator"; -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn single_govmod_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_single::contract::execute, - dao_proposal_single::contract::instantiate, - dao_proposal_single::contract::query, - ) - .with_reply(dao_proposal_single::contract::reply); - Box::new(contract) -} - -fn cw20_balances_voting() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_balance::contract::execute, - dao_voting_cw20_balance::contract::instantiate, - dao_voting_cw20_balance::contract::query, - ) - .with_reply(dao_voting_cw20_balance::contract::reply); - Box::new(contract) -} - -fn cw_gov_contract() -> Box> { - let contract = ContractWrapper::new( - dao_dao_core::contract::execute, - dao_dao_core::contract::instantiate, - dao_dao_core::contract::query, - ) - .with_reply(dao_dao_core::contract::reply); - Box::new(contract) -} - -fn counters_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ); - Box::new(contract) -} - fn instantiate_governance( app: &mut App, code_id: u64, @@ -87,9 +42,9 @@ fn instantiate_with_default_governance( msg: dao_proposal_single::msg::InstantiateMsg, initial_balances: Option>, ) -> Addr { - let cw20_id = app.store_code(cw20_contract()); - let governance_id = app.store_code(cw_gov_contract()); - let votemod_id = app.store_code(cw20_balances_voting()); + let cw20_id = app.store_code(cw20_base_contract()); + let governance_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_balance_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -140,8 +95,8 @@ fn instantiate_with_default_governance( #[test] fn test_counters() { let mut app = App::default(); - let govmod_id = app.store_code(single_govmod_contract()); - let counters_id = app.store_code(counters_contract()); + let govmod_id = app.store_code(dao_proposal_single_contract()); + let counters_id = app.store_code(dao_proposal_hook_counter_contract()); let threshold = Threshold::AbsolutePercentage { percentage: PercentageThreshold::Majority {}, diff --git a/contracts/test/dao-voting-cw20-balance/Cargo.toml b/contracts/test/dao-voting-cw20-balance/Cargo.toml index f126b6840..94d1f0cb0 100644 --- a/contracts/test/dao-voting-cw20-balance/Cargo.toml +++ b/contracts/test/dao-voting-cw20-balance/Cargo.toml @@ -26,7 +26,8 @@ cw-utils = { workspace = true } thiserror = { workspace = true } dao-dao-macros = { workspace = true } dao-interface = { workspace = true } -cw20-base = { workspace = true, features = ["library"] } +cw20-base = { workspace = true, features = ["library"] } [dev-dependencies] cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/test/dao-voting-cw20-balance/src/tests.rs b/contracts/test/dao-voting-cw20-balance/src/tests.rs index 4560fd5ea..79d1a6cd4 100644 --- a/contracts/test/dao-voting-cw20-balance/src/tests.rs +++ b/contracts/test/dao-voting-cw20-balance/src/tests.rs @@ -1,33 +1,15 @@ -use cosmwasm_std::{Addr, Empty, Uint128}; +use cosmwasm_std::{Addr, Uint128}; use cw2::ContractVersion; use cw20::{Cw20Coin, MinterResponse, TokenInfoResponse}; -use cw_multi_test::{App, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, Executor}; use dao_interface::voting::{InfoResponse, VotingPowerAtHeightResponse}; +use dao_testing::contracts::{cw20_base_contract, dao_voting_cw20_balance_contract}; use crate::msg::{InstantiateMsg, QueryMsg}; const DAO_ADDR: &str = "dao"; const CREATOR_ADDR: &str = "creator"; -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn balance_voting_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply); - Box::new(contract) -} - fn instantiate_voting(app: &mut App, voting_id: u64, msg: InstantiateMsg) -> Addr { app.instantiate_contract( voting_id, @@ -44,8 +26,8 @@ fn instantiate_voting(app: &mut App, voting_id: u64, msg: InstantiateMsg) -> Add #[should_panic(expected = "Initial governance token balances must not be empty")] fn test_instantiate_zero_supply() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(balance_voting_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); instantiate_voting( &mut app, voting_id, @@ -70,8 +52,8 @@ fn test_instantiate_zero_supply() { #[should_panic(expected = "Initial governance token balances must not be empty")] fn test_instantiate_no_balances() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(balance_voting_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); instantiate_voting( &mut app, voting_id, @@ -92,8 +74,8 @@ fn test_instantiate_no_balances() { #[test] fn test_contract_info() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(balance_voting_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); let voting_addr = instantiate_voting( &mut app, @@ -132,8 +114,8 @@ fn test_contract_info() { #[test] fn test_new_cw20() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(balance_voting_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); let voting_addr = instantiate_voting( &mut app, @@ -257,8 +239,8 @@ fn test_new_cw20() { #[test] fn test_existing_cw20() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(balance_voting_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_balance_contract()); let token_addr = app .instantiate_contract( diff --git a/contracts/voting/dao-voting-cw20-staked/Cargo.toml b/contracts/voting/dao-voting-cw20-staked/Cargo.toml index 4eae84a64..8a3857f54 100644 --- a/contracts/voting/dao-voting-cw20-staked/Cargo.toml +++ b/contracts/voting/dao-voting-cw20-staked/Cargo.toml @@ -32,3 +32,4 @@ dao-voting = { workspace = true } [dev-dependencies] cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/voting/dao-voting-cw20-staked/src/tests.rs b/contracts/voting/dao-voting-cw20-staked/src/tests.rs index 0022f98ed..1ba100fb0 100644 --- a/contracts/voting/dao-voting-cw20-staked/src/tests.rs +++ b/contracts/voting/dao-voting-cw20-staked/src/tests.rs @@ -1,11 +1,14 @@ use cosmwasm_std::{ testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, CosmosMsg, Decimal, Empty, Uint128, WasmMsg, + to_json_binary, Addr, CosmosMsg, Decimal, Uint128, WasmMsg, }; use cw2::ContractVersion; use cw20::{BalanceResponse, Cw20Coin, MinterResponse, TokenInfoResponse}; -use cw_multi_test::{next_block, App, Contract, ContractWrapper, Executor}; +use cw_multi_test::{next_block, App, Executor}; use dao_interface::voting::{InfoResponse, IsActiveResponse, VotingPowerAtHeightResponse}; +use dao_testing::contracts::{ + cw20_base_contract, cw20_stake_contract, dao_voting_cw20_staked_contract, +}; use dao_voting::threshold::{ActiveThreshold, ActiveThresholdResponse}; use crate::{ @@ -16,35 +19,6 @@ use crate::{ const DAO_ADDR: &str = "dao"; const CREATOR_ADDR: &str = "creator"; -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -fn staking_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - -fn staked_balance_voting_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - fn instantiate_voting(app: &mut App, voting_id: u64, msg: InstantiateMsg) -> Addr { app.instantiate_contract( voting_id, @@ -71,9 +45,9 @@ fn stake_tokens(app: &mut App, staking_addr: Addr, cw20_addr: Addr, sender: &str #[should_panic(expected = "Initial governance token balances must not be empty")] fn test_instantiate_zero_supply() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, voting_id, @@ -102,9 +76,9 @@ fn test_instantiate_zero_supply() { #[should_panic(expected = "Initial governance token balances must not be empty")] fn test_instantiate_no_balances() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, voting_id, @@ -130,9 +104,9 @@ fn test_instantiate_no_balances() { #[should_panic(expected = "Active threshold count must be greater than zero")] fn test_instantiate_zero_active_threshold_count() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, voting_id, @@ -162,9 +136,9 @@ fn test_instantiate_zero_active_threshold_count() { #[test] fn test_contract_info() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -213,9 +187,9 @@ fn test_contract_info() { #[test] fn test_new_cw20() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -374,9 +348,9 @@ fn test_new_cw20() { #[test] fn test_existing_cw20_new_staking() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_id = app.store_code(cw20_stake_contract()); let token_addr = app .instantiate_contract( @@ -525,9 +499,9 @@ fn test_existing_cw20_new_staking() { #[test] fn test_existing_cw20_existing_staking() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_id = app.store_code(cw20_stake_contract()); let token_addr = app .instantiate_contract( @@ -726,9 +700,9 @@ fn test_existing_cw20_existing_staking() { #[test] fn test_different_heights() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_id = app.store_code(cw20_stake_contract()); let token_addr = app .instantiate_contract( @@ -926,9 +900,9 @@ fn test_different_heights() { #[test] fn test_active_threshold_absolute_count() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -986,9 +960,9 @@ fn test_active_threshold_absolute_count() { #[test] fn test_active_threshold_percent() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -1046,9 +1020,9 @@ fn test_active_threshold_percent() { #[test] fn test_active_threshold_percent_rounds_up() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -1121,9 +1095,9 @@ fn test_active_threshold_percent_rounds_up() { #[test] fn test_active_threshold_none() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -1159,9 +1133,9 @@ fn test_active_threshold_none() { #[test] fn test_update_active_threshold() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = instantiate_voting( &mut app, @@ -1227,9 +1201,9 @@ fn test_update_active_threshold() { #[should_panic(expected = "Active threshold percentage must be greater than 0 and less than 1")] fn test_active_threshold_percentage_gt_100() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, @@ -1261,9 +1235,9 @@ fn test_active_threshold_percentage_gt_100() { #[should_panic(expected = "Active threshold percentage must be greater than 0 and less than 1")] fn test_active_threshold_percentage_lte_0() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, @@ -1295,9 +1269,9 @@ fn test_active_threshold_percentage_lte_0() { #[should_panic(expected = "Absolute count threshold cannot be greater than the total token supply")] fn test_active_threshold_absolute_count_invalid() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); instantiate_voting( &mut app, @@ -1328,9 +1302,9 @@ fn test_active_threshold_absolute_count_invalid() { #[test] fn test_migrate() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); - let voting_id = app.store_code(staked_balance_voting_contract()); - let staking_contract_id = app.store_code(staking_contract()); + let cw20_id = app.store_code(cw20_base_contract()); + let voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let staking_contract_id = app.store_code(cw20_stake_contract()); let voting_addr = app .instantiate_contract( diff --git a/contracts/voting/dao-voting-cw4/Cargo.toml b/contracts/voting/dao-voting-cw4/Cargo.toml index 55c671560..9120acf99 100644 --- a/contracts/voting/dao-voting-cw4/Cargo.toml +++ b/contracts/voting/dao-voting-cw4/Cargo.toml @@ -29,4 +29,6 @@ cw4 = { workspace = true } cw4-group = { workspace = true } [dev-dependencies] +dao-voting-cw4 = { workspace = true } cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/contracts/voting/dao-voting-cw4/src/tests.rs b/contracts/voting/dao-voting-cw4/src/tests.rs index 769c53c4c..9ada195e2 100644 --- a/contracts/voting/dao-voting-cw4/src/tests.rs +++ b/contracts/voting/dao-voting-cw4/src/tests.rs @@ -1,18 +1,19 @@ use cosmwasm_std::{ testing::{mock_dependencies, mock_env}, - to_json_binary, Addr, CosmosMsg, Empty, Uint128, WasmMsg, + to_json_binary, Addr, CosmosMsg, Uint128, WasmMsg, }; use cw2::ContractVersion; -use cw_multi_test::{next_block, App, Contract, ContractWrapper, Executor}; +use cw_multi_test::{next_block, App, Executor}; use dao_interface::voting::{ InfoResponse, TotalPowerAtHeightResponse, VotingPowerAtHeightResponse, }; +use dao_testing::contracts::{cw4_group_contract, dao_voting_cw4_contract}; use crate::{ contract::{migrate, CONTRACT_NAME, CONTRACT_VERSION}, msg::{GroupContract, InstantiateMsg, MigrateMsg, QueryMsg}, - ContractError, }; +use dao_voting_cw4::ContractError; const DAO_ADDR: &str = "dao"; const ADDR1: &str = "addr1"; @@ -20,26 +21,6 @@ const ADDR2: &str = "addr2"; const ADDR3: &str = "addr3"; const ADDR4: &str = "addr4"; -fn cw4_contract() -> Box> { - let contract = ContractWrapper::new( - cw4_group::contract::execute, - cw4_group::contract::instantiate, - cw4_group::contract::query, - ); - Box::new(contract) -} - -fn voting_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - fn instantiate_voting(app: &mut App, voting_id: u64, msg: InstantiateMsg) -> Addr { app.instantiate_contract( voting_id, @@ -53,8 +34,8 @@ fn instantiate_voting(app: &mut App, voting_id: u64, msg: InstantiateMsg) -> Add } fn setup_test_case(app: &mut App) -> Addr { - let cw4_id = app.store_code(cw4_contract()); - let voting_id = app.store_code(voting_contract()); + let cw4_id = app.store_code(cw4_group_contract()); + let voting_id = app.store_code(dao_voting_cw4_contract()); let members = vec![ cw4::Member { @@ -93,8 +74,8 @@ fn test_instantiate() { let _voting_addr = setup_test_case(&mut app); // Instantiate with no members, error - let voting_id = app.store_code(voting_contract()); - let cw4_id = app.store_code(cw4_contract()); + let voting_id = app.store_code(dao_voting_cw4_contract()); + let cw4_id = app.store_code(cw4_group_contract()); let msg = InstantiateMsg { group_contract: GroupContract::New { cw4_group_code_id: cw4_id, @@ -148,8 +129,8 @@ fn test_instantiate() { pub fn test_instantiate_existing_contract() { let mut app = App::default(); - let voting_id = app.store_code(voting_contract()); - let cw4_id = app.store_code(cw4_contract()); + let voting_id = app.store_code(dao_voting_cw4_contract()); + let cw4_id = app.store_code(cw4_group_contract()); // Fail with no members. let cw4_addr = app @@ -573,8 +554,8 @@ fn test_migrate() { ]; // Instantiate with no members, error - let voting_id = app.store_code(voting_contract()); - let cw4_id = app.store_code(cw4_contract()); + let voting_id = app.store_code(dao_voting_cw4_contract()); + let cw4_id = app.store_code(cw4_group_contract()); let msg = InstantiateMsg { group_contract: GroupContract::New { cw4_group_code_id: cw4_id, @@ -631,8 +612,8 @@ fn test_migrate() { fn test_duplicate_member() { let mut app = App::default(); let _voting_addr = setup_test_case(&mut app); - let voting_id = app.store_code(voting_contract()); - let cw4_id = app.store_code(cw4_contract()); + let voting_id = app.store_code(dao_voting_cw4_contract()); + let cw4_id = app.store_code(cw4_group_contract()); // Instantiate with members but have a duplicate // Total weight is actually 69 but ADDR3 appears twice. let msg = InstantiateMsg { diff --git a/contracts/voting/dao-voting-cw721-staked/src/testing/mod.rs b/contracts/voting/dao-voting-cw721-staked/src/testing/mod.rs index c454212c4..aaeeaf8d7 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/testing/mod.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/testing/mod.rs @@ -18,7 +18,7 @@ mod test_tube_env; use cosmwasm_std::Addr; use cw_multi_test::{App, Executor}; use cw_utils::Duration; -use dao_testing::contracts::cw721_staked_voting_contract; +use dao_testing::contracts::dao_voting_cw721_staked_contract; use crate::msg::{InstantiateMsg, NftContract}; @@ -35,7 +35,7 @@ pub(crate) struct CommonTest { pub(crate) fn setup_test(unstaking_duration: Option) -> CommonTest { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let nft = instantiate_cw721_base(&mut app, CREATOR_ADDR, CREATOR_ADDR); let module = app diff --git a/contracts/voting/dao-voting-cw721-staked/src/testing/tests.rs b/contracts/voting/dao-voting-cw721-staked/src/testing/tests.rs index 7126bd904..1ce42119d 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/testing/tests.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/testing/tests.rs @@ -6,7 +6,7 @@ use cw_multi_test::{next_block, App, BankSudo, Executor, SudoMsg}; use cw_utils::Duration; use dao_interface::voting::IsActiveResponse; use dao_testing::contracts::{ - cw721_base_contract, cw721_staked_voting_contract, dao_test_custom_factory, + cw721_base_contract, dao_test_custom_factory_contract, dao_voting_cw721_staked_contract, }; use dao_voting::threshold::{ActiveThreshold, ActiveThresholdResponse}; @@ -34,7 +34,7 @@ use super::{ #[test] fn test_instantiate_with_new_cw721_collection() -> anyhow::Result<()> { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); let module_addr = app @@ -421,7 +421,7 @@ fn test_add_remove_hooks() -> anyhow::Result<()> { #[test] fn test_instantiate_with_invalid_duration_fails() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); let err = app @@ -462,7 +462,7 @@ fn test_instantiate_with_invalid_duration_fails() { fn test_instantiate_zero_active_threshold_count() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); app.instantiate_contract( module_id, @@ -502,7 +502,7 @@ fn test_instantiate_zero_active_threshold_count() { fn test_instantiate_invalid_active_threshold_count_new_nft() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); app.instantiate_contract( module_id, @@ -541,7 +541,7 @@ fn test_instantiate_invalid_active_threshold_count_new_nft() { #[should_panic(expected = "Absolute count threshold cannot be greater than the total token supply")] fn test_instantiate_invalid_active_threshold_count_existing_nft() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_addr = instantiate_cw721_base(&mut app, CREATOR_ADDR, CREATOR_ADDR); app.instantiate_contract( @@ -567,7 +567,7 @@ fn test_instantiate_invalid_active_threshold_count_existing_nft() { fn test_active_threshold_absolute_count() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let voting_addr = app .instantiate_contract( @@ -647,7 +647,7 @@ fn test_active_threshold_absolute_count() { fn test_active_threshold_percent() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let voting_addr = app .instantiate_contract( @@ -708,7 +708,7 @@ fn test_active_threshold_percent() { fn test_active_threshold_percent_rounds_up() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let voting_addr = app .instantiate_contract( @@ -810,7 +810,7 @@ fn test_active_threshold_percent_rounds_up() { fn test_update_active_threshold() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let voting_addr = app .instantiate_contract( @@ -887,7 +887,7 @@ fn test_update_active_threshold() { fn test_active_threshold_percentage_gt_100() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); app.instantiate_contract( module_id, @@ -929,7 +929,7 @@ fn test_active_threshold_percentage_gt_100() { fn test_active_threshold_percentage_lte_0() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); app.instantiate_contract( module_id, @@ -967,7 +967,7 @@ fn test_active_threshold_percentage_lte_0() { #[test] fn test_invalid_instantiate_msg() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); let err = app @@ -1006,7 +1006,7 @@ fn test_invalid_instantiate_msg() { #[test] fn test_invalid_initial_nft_msg() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); let err = app @@ -1045,7 +1045,7 @@ fn test_invalid_initial_nft_msg() { #[test] fn test_invalid_initial_nft_msg_wrong_absolute_count() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); let err = app @@ -1096,7 +1096,7 @@ fn test_invalid_initial_nft_msg_wrong_absolute_count() { fn test_no_initial_nfts_fails() { let mut app = App::default(); let cw721_id = app.store_code(cw721_base_contract()); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let err = app .instantiate_contract( @@ -1133,9 +1133,9 @@ fn test_no_initial_nfts_fails() { #[test] fn test_factory() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); - let factory_id = app.store_code(dao_test_custom_factory()); + let factory_id = app.store_code(dao_test_custom_factory_contract()); // Instantiate factory let factory_addr = app @@ -1186,9 +1186,9 @@ fn test_factory() { #[test] fn test_factory_with_funds_pass_through() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); - let factory_id = app.store_code(dao_test_custom_factory()); + let factory_id = app.store_code(dao_test_custom_factory_contract()); // Mint some tokens to creator app.sudo(SudoMsg::Bank(BankSudo::Mint { @@ -1307,7 +1307,7 @@ fn test_factory_with_funds_pass_through() { #[should_panic(expected = "Factory message must serialize to WasmMsg::Execute")] fn test_unsupported_factory_msg() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let cw721_id = app.store_code(cw721_base_contract()); // Instantiate using factory succeeds @@ -1352,9 +1352,9 @@ fn test_unsupported_factory_msg() { )] fn test_factory_wrong_callback() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let _cw721_id = app.store_code(cw721_base_contract()); - let factory_id = app.store_code(dao_test_custom_factory()); + let factory_id = app.store_code(dao_test_custom_factory_contract()); // Instantiate factory let factory_addr = app @@ -1400,9 +1400,9 @@ fn test_factory_wrong_callback() { #[should_panic(expected = "Invalid reply from sub-message: Missing reply data")] fn test_factory_no_callback() { let mut app = App::default(); - let module_id = app.store_code(cw721_staked_voting_contract()); + let module_id = app.store_code(dao_voting_cw721_staked_contract()); let _cw721_id = app.store_code(cw721_base_contract()); - let factory_id = app.store_code(dao_test_custom_factory()); + let factory_id = app.store_code(dao_test_custom_factory_contract()); // Instantiate factory let factory_addr = app diff --git a/contracts/voting/dao-voting-onft-staked/src/testing/mod.rs b/contracts/voting/dao-voting-onft-staked/src/testing/mod.rs index 487a4dde0..30012f8fa 100644 --- a/contracts/voting/dao-voting-onft-staked/src/testing/mod.rs +++ b/contracts/voting/dao-voting-onft-staked/src/testing/mod.rs @@ -9,7 +9,7 @@ use app::OmniflixApp; use cosmwasm_std::Addr; use cw_multi_test::Executor; use cw_utils::Duration; -use dao_testing::contracts::onft_staked_voting_contract; +use dao_testing::contracts::dao_voting_onft_staked_contract; use dao_voting::threshold::ActiveThreshold; use crate::msg::{InstantiateMsg, OnftCollection}; @@ -33,7 +33,7 @@ pub(crate) fn setup_test( active_threshold: Option, ) -> CommonTest { let mut app = OmniflixApp::new(); - let module_id = app.store_code(onft_staked_voting_contract()); + let module_id = app.store_code(dao_voting_onft_staked_contract()); let nft = create_onft_collection(&mut app, "nft", DAO, DAO); let module = app diff --git a/contracts/voting/dao-voting-token-staked/src/tests/multitest/tests.rs b/contracts/voting/dao-voting-token-staked/src/tests/multitest/tests.rs index 90b4fab28..31133e300 100644 --- a/contracts/voting/dao-voting-token-staked/src/tests/multitest/tests.rs +++ b/contracts/voting/dao-voting-token-staked/src/tests/multitest/tests.rs @@ -5,16 +5,17 @@ use crate::msg::{ }; use crate::state::Config; use cosmwasm_std::testing::{mock_dependencies, mock_env}; -use cosmwasm_std::{coins, Addr, Coin, Decimal, Empty, Uint128}; +use cosmwasm_std::{coins, Addr, Coin, Decimal, Uint128}; use cw_controllers::ClaimsResponse; -use cw_multi_test::{ - next_block, App, AppResponse, BankSudo, Contract, ContractWrapper, Executor, SudoMsg, -}; +use cw_multi_test::{next_block, App, AppResponse, BankSudo, Executor, SudoMsg}; use cw_utils::Duration; use dao_interface::voting::{ DenomResponse, InfoResponse, IsActiveResponse, TotalPowerAtHeightResponse, VotingPowerAtHeightResponse, }; +use dao_testing::contracts::{ + dao_proposal_hook_counter_contract, dao_voting_token_staked_contract, +}; use dao_voting::threshold::{ActiveThreshold, ActiveThresholdResponse}; const DAO_ADDR: &str = "dao"; @@ -24,26 +25,6 @@ const DENOM: &str = "ujuno"; const INVALID_DENOM: &str = "uinvalid"; const ODD_DENOM: &str = "uodd"; -fn hook_counter_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_hook_counter::contract::execute, - dao_proposal_hook_counter::contract::instantiate, - dao_proposal_hook_counter::contract::query, - ); - Box::new(contract) -} - -fn staking_contract() -> Box> { - let contract = ContractWrapper::new( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, - ) - .with_reply(crate::contract::reply) - .with_migrate(crate::contract::migrate); - Box::new(contract) -} - fn mock_app() -> App { let mut app = App::default(); app.sudo(SudoMsg::Bank(BankSudo::Mint { @@ -205,7 +186,7 @@ fn get_balance(app: &mut App, address: &str, denom: &str) -> Uint128 { fn test_instantiate_existing() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); // Populated fields instantiate_staking( &mut app, @@ -249,7 +230,7 @@ fn test_instantiate_existing() { fn test_instantiate_invalid_unstaking_duration_height() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); // Populated fields instantiate_staking( @@ -272,7 +253,7 @@ fn test_instantiate_invalid_unstaking_duration_height() { fn test_instantiate_invalid_unstaking_duration_time() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); // Populated fields with height instantiate_staking( @@ -295,7 +276,7 @@ fn test_instantiate_invalid_unstaking_duration_time() { fn test_stake_invalid_denom() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -316,7 +297,7 @@ fn test_stake_invalid_denom() { fn test_stake_valid_denom() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -339,7 +320,7 @@ fn test_stake_valid_denom() { fn test_unstake_none_staked() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -360,7 +341,7 @@ fn test_unstake_none_staked() { fn test_unstake_zero_tokens() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -381,7 +362,7 @@ fn test_unstake_zero_tokens() { fn test_unstake_invalid_balance() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -406,7 +387,7 @@ fn test_unstake_invalid_balance() { fn test_unstake() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -443,7 +424,7 @@ fn test_unstake() { fn test_unstake_no_unstaking_duration() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -482,7 +463,7 @@ fn test_unstake_no_unstaking_duration() { fn test_claim_no_claims() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -503,7 +484,7 @@ fn test_claim_no_claims() { fn test_claim_claim_not_reached() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -532,7 +513,7 @@ fn test_claim_claim_not_reached() { fn test_claim() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -585,7 +566,7 @@ fn test_claim() { fn test_update_config_invalid_sender() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -606,7 +587,7 @@ fn test_update_config_invalid_sender() { fn test_update_config_as_owner() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -636,7 +617,7 @@ fn test_update_config_as_owner() { fn test_update_config_invalid_duration() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -657,7 +638,7 @@ fn test_update_config_invalid_duration() { fn test_query_dao() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -679,7 +660,7 @@ fn test_query_dao() { fn test_query_info() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -701,7 +682,7 @@ fn test_query_info() { fn test_query_claims() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -739,7 +720,7 @@ fn test_query_claims() { fn test_query_get_config() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -765,7 +746,7 @@ fn test_query_get_config() { fn test_voting_power_queries() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -873,7 +854,7 @@ fn test_voting_power_queries() { fn test_query_list_stakers() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -960,7 +941,7 @@ fn test_query_list_stakers() { fn test_instantiate_zero_active_threshold_count() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); instantiate_staking( &mut app, staking_id, @@ -980,7 +961,7 @@ fn test_instantiate_zero_active_threshold_count() { fn test_active_threshold_absolute_count() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, @@ -1019,7 +1000,7 @@ fn test_active_threshold_absolute_count() { fn test_active_threshold_percent() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -1057,7 +1038,7 @@ fn test_active_threshold_percent() { fn test_active_threshold_percent_rounds_up() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -1104,7 +1085,7 @@ fn test_active_threshold_percent_rounds_up() { fn test_active_threshold_none() { let mut app = App::default(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -1129,7 +1110,7 @@ fn test_active_threshold_none() { fn test_update_active_threshold() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, staking_id, @@ -1181,7 +1162,7 @@ fn test_update_active_threshold() { fn test_active_threshold_percentage_gt_100() { let mut app = App::default(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); instantiate_staking( &mut app, staking_id, @@ -1204,7 +1185,7 @@ fn test_active_threshold_percentage_gt_100() { fn test_active_threshold_percentage_lte_0() { let mut app = App::default(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); instantiate_staking( &mut app, staking_id, @@ -1225,7 +1206,7 @@ fn test_active_threshold_percentage_lte_0() { fn test_active_threshold_absolute_count_invalid() { let mut app = App::default(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); instantiate_staking( &mut app, staking_id, @@ -1245,7 +1226,7 @@ fn test_active_threshold_absolute_count_invalid() { fn test_add_remove_hooks() { let mut app = App::default(); - let staking_id = app.store_code(staking_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); let addr = instantiate_staking( &mut app, @@ -1307,8 +1288,8 @@ fn test_add_remove_hooks() { fn test_staking_hooks() { let mut app = mock_app(); - let staking_id = app.store_code(staking_contract()); - let hook_id = app.store_code(hook_counter_contract()); + let staking_id = app.store_code(dao_voting_token_staked_contract()); + let hook_id = app.store_code(dao_proposal_hook_counter_contract()); let hook = app .instantiate_contract( diff --git a/packages/cw-denom/Cargo.toml b/packages/cw-denom/Cargo.toml index dfb3b543d..8a0589efc 100644 --- a/packages/cw-denom/Cargo.toml +++ b/packages/cw-denom/Cargo.toml @@ -17,3 +17,4 @@ cw20 = { workspace = true } [dev-dependencies] cw20-base = { workspace = true } cw-multi-test = { workspace = true } +dao-testing = { workspace = true } diff --git a/packages/cw-denom/src/integration_tests.rs b/packages/cw-denom/src/integration_tests.rs index 0cf73c55a..70dba3120 100644 --- a/packages/cw-denom/src/integration_tests.rs +++ b/packages/cw-denom/src/integration_tests.rs @@ -1,23 +1,15 @@ -use cosmwasm_std::{coins, Addr, Empty, Uint128}; +use cosmwasm_std::{coins, Addr, Uint128}; use cw20::Cw20Coin; -use cw_multi_test::{App, BankSudo, Contract, ContractWrapper, Executor}; +use cw_multi_test::{App, BankSudo, Executor}; +use dao_testing::contracts::cw20_base_contract; use crate::CheckedDenom; -fn cw20_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - #[test] fn test_cw20_denom_send() { let mut app = App::default(); - let cw20_id = app.store_code(cw20_contract()); + let cw20_id = app.store_code(cw20_base_contract()); let cw20 = app .instantiate_contract( cw20_id, diff --git a/packages/dao-testing/Cargo.toml b/packages/dao-testing/Cargo.toml index 9b191be86..46429de16 100644 --- a/packages/dao-testing/Cargo.toml +++ b/packages/dao-testing/Cargo.toml @@ -1,6 +1,10 @@ [package] name = "dao-testing" -authors = ["ekez ekez@withoutdoing.com", "Jake Hartnell "] +authors = [ + "ekez ekez@withoutdoing.com", + "Jake Hartnell ", + "noah ", +] description = "Testing helper functions and interfaces for testing DAO modules." edition = { workspace = true } license = { workspace = true } @@ -36,21 +40,31 @@ rand = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +btsg-ft-factory = { workspace = true } cw-admin-factory = { workspace = true } -cw-core-v1 = { workspace = true, features = ["library"] } +cw-fund-distributor = { workspace = true } cw-hooks = { workspace = true } -cw-proposal-single-v1 = { workspace = true } +cw-payroll-factory = { workspace = true } +cw-token-swap = { workspace = true } cw-vesting = { workspace = true } cw20-stake = { workspace = true } +cw20-stake-external-rewards = { workspace = true } +cw20-stake-reward-distributor = { workspace = true } cw721-base = { workspace = true } cw721-roles = { workspace = true } cw-tokenfactory-issuer = { workspace = true } -dao-dao-core = { workspace = true, features = ["library"] } +dao-dao-core = { workspace = true } dao-interface = { workspace = true } +dao-migrator = { workspace = true } +dao-pre-propose-approver = { workspace = true } dao-pre-propose-multiple = { workspace = true } dao-pre-propose-single = { workspace = true } +dao-pre-propose-approval-single = { workspace = true } dao-proposal-condorcet = { workspace = true } dao-proposal-single = { workspace = true } +dao-proposal-multiple = { workspace = true } +dao-proposal-sudo = { workspace = true } +dao-rewards-distributor = { workspace = true } dao-test-custom-factory = { workspace = true } dao-voting = { workspace = true } dao-voting-cw20-balance = { workspace = true } @@ -60,5 +74,25 @@ dao-voting-cw721-staked = { workspace = true } dao-voting-cw721-roles = { workspace = true } dao-voting-onft-staked = { workspace = true } dao-voting-token-staked = { workspace = true } -voting-v1 = { workspace = true } +dao-proposal-hook-counter = { workspace = true } + +# v1 migration +cw-core-v1 = { workspace = true } +cw-proposal-single-v1 = { workspace = true } +cw4-voting-v1 = { workspace = true } +cw20-stake-v1 = { workspace = true } +cw20-stake-external-rewards-v1 = { workspace = true } +cw20-stake-reward-distributor-v1 = { workspace = true } stake-cw20-v03 = { workspace = true } +voting-v1 = { workspace = true } + +# v2.4.1 migration +dao-dao-core-v241 = { workspace = true } +dao-interface-v241 = { workspace = true } +dao-pre-propose-approval-single-v241 = { workspace = true } +dao-pre-propose-single-v241 = { workspace = true } +dao-pre-propose-multiple-v241 = { workspace = true } +dao-proposal-single-v241 = { workspace = true } +dao-proposal-multiple-v241 = { workspace = true } +dao-voting-cw4-v241 = { workspace = true } +dao-voting-v241 = { workspace = true } diff --git a/packages/dao-testing/src/contracts.rs b/packages/dao-testing/src/contracts.rs deleted file mode 100644 index 1739ed124..000000000 --- a/packages/dao-testing/src/contracts.rs +++ /dev/null @@ -1,218 +0,0 @@ -use cosmwasm_std::Empty; - -use cw_multi_test::{Contract, ContractWrapper}; -use dao_pre_propose_multiple as cppm; -use dao_pre_propose_single as cpps; - -pub fn cw20_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_base::contract::execute, - cw20_base::contract::instantiate, - cw20_base::contract::query, - ); - Box::new(contract) -} - -pub fn cw4_group_contract() -> Box> { - let contract = ContractWrapper::new( - cw4_group::contract::execute, - cw4_group::contract::instantiate, - cw4_group::contract::query, - ); - Box::new(contract) -} - -pub fn cw721_base_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_base::entry::execute, - cw721_base::entry::instantiate, - cw721_base::entry::query, - ); - Box::new(contract) -} - -pub fn cw721_roles_contract() -> Box> { - let contract = ContractWrapper::new( - cw721_roles::contract::execute, - cw721_roles::contract::instantiate, - cw721_roles::contract::query, - ); - Box::new(contract) -} - -pub fn cw20_stake_contract() -> Box> { - let contract = ContractWrapper::new( - cw20_stake::contract::execute, - cw20_stake::contract::instantiate, - cw20_stake::contract::query, - ); - Box::new(contract) -} - -pub fn proposal_condorcet_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_condorcet::contract::execute, - dao_proposal_condorcet::contract::instantiate, - dao_proposal_condorcet::contract::query, - ) - .with_reply(dao_proposal_condorcet::contract::reply); - Box::new(contract) -} - -pub fn proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - dao_proposal_single::contract::execute, - dao_proposal_single::contract::instantiate, - dao_proposal_single::contract::query, - ) - .with_reply(dao_proposal_single::contract::reply) - .with_migrate(dao_proposal_single::contract::migrate); - Box::new(contract) -} - -pub fn pre_propose_single_contract() -> Box> { - let contract = ContractWrapper::new( - cpps::contract::execute, - cpps::contract::instantiate, - cpps::contract::query, - ); - Box::new(contract) -} - -pub fn pre_propose_multiple_contract() -> Box> { - let contract = ContractWrapper::new( - cppm::contract::execute, - cppm::contract::instantiate, - cppm::contract::query, - ); - Box::new(contract) -} - -pub fn cw20_staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_staked::contract::execute, - dao_voting_cw20_staked::contract::instantiate, - dao_voting_cw20_staked::contract::query, - ) - .with_reply(dao_voting_cw20_staked::contract::reply); - Box::new(contract) -} - -pub fn cw20_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw20_balance::contract::execute, - dao_voting_cw20_balance::contract::instantiate, - dao_voting_cw20_balance::contract::query, - ) - .with_reply(dao_voting_cw20_balance::contract::reply); - Box::new(contract) -} - -pub fn native_staked_balances_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_token_staked::contract::execute, - dao_voting_token_staked::contract::instantiate, - dao_voting_token_staked::contract::query, - ) - .with_reply(dao_voting_token_staked::contract::reply); - Box::new(contract) -} - -pub fn cw721_staked_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw721_staked::contract::execute, - dao_voting_cw721_staked::contract::instantiate, - dao_voting_cw721_staked::contract::query, - ) - .with_reply(dao_voting_cw721_staked::contract::reply); - Box::new(contract) -} - -pub fn onft_staked_voting_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_onft_staked::contract::execute, - dao_voting_onft_staked::contract::instantiate, - dao_voting_onft_staked::contract::query, - ); - Box::new(contract) -} - -pub fn dao_dao_contract() -> Box> { - let contract = ContractWrapper::new( - dao_dao_core::contract::execute, - dao_dao_core::contract::instantiate, - dao_dao_core::contract::query, - ) - .with_reply(dao_dao_core::contract::reply) - .with_migrate(dao_dao_core::contract::migrate); - Box::new(contract) -} - -pub fn dao_voting_cw4_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw4::contract::execute, - dao_voting_cw4::contract::instantiate, - dao_voting_cw4::contract::query, - ) - .with_reply(dao_voting_cw4::contract::reply); - Box::new(contract) -} - -pub fn dao_voting_cw721_roles_contract() -> Box> { - let contract = ContractWrapper::new( - dao_voting_cw721_roles::contract::execute, - dao_voting_cw721_roles::contract::instantiate, - dao_voting_cw721_roles::contract::query, - ) - .with_reply(dao_voting_cw721_roles::contract::reply); - Box::new(contract) -} - -pub fn v1_proposal_single_contract() -> Box> { - let contract = ContractWrapper::new( - cw_proposal_single_v1::contract::execute, - cw_proposal_single_v1::contract::instantiate, - cw_proposal_single_v1::contract::query, - ) - .with_reply(cw_proposal_single_v1::contract::reply) - .with_migrate(cw_proposal_single_v1::contract::migrate); - Box::new(contract) -} - -pub fn v1_dao_dao_contract() -> Box> { - let contract = ContractWrapper::new( - cw_core_v1::contract::execute, - cw_core_v1::contract::instantiate, - cw_core_v1::contract::query, - ) - .with_reply(cw_core_v1::contract::reply); - Box::new(contract) -} - -pub fn cw_vesting_contract() -> Box> { - let contract = ContractWrapper::new( - cw_vesting::contract::execute, - cw_vesting::contract::instantiate, - cw_vesting::contract::query, - ); - Box::new(contract) -} - -pub fn stake_cw20_v03_contract() -> Box> { - let contract = ContractWrapper::new( - stake_cw20_v03::contract::execute, - stake_cw20_v03::contract::instantiate, - stake_cw20_v03::contract::query, - ); - Box::new(contract) -} - -pub fn dao_test_custom_factory() -> Box> { - let contract = ContractWrapper::new( - dao_test_custom_factory::contract::execute, - dao_test_custom_factory::contract::instantiate, - dao_test_custom_factory::contract::query, - ) - .with_reply(dao_test_custom_factory::contract::reply); - Box::new(contract) -} diff --git a/packages/dao-testing/src/contracts/latest.rs b/packages/dao-testing/src/contracts/latest.rs new file mode 100644 index 000000000..1bbc8aefd --- /dev/null +++ b/packages/dao-testing/src/contracts/latest.rs @@ -0,0 +1,336 @@ +use cosmwasm_std::Empty; +use cw_multi_test::{Contract, ContractWrapper}; + +pub fn cw20_base_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_base::contract::execute, + cw20_base::contract::instantiate, + cw20_base::contract::query, + ) + .with_migrate(cw20_base::contract::migrate); + Box::new(contract) +} + +pub fn cw4_group_contract() -> Box> { + let contract = ContractWrapper::new( + cw4_group::contract::execute, + cw4_group::contract::instantiate, + cw4_group::contract::query, + ); + Box::new(contract) +} + +pub fn cw721_base_contract() -> Box> { + let contract = ContractWrapper::new( + cw721_base::entry::execute, + cw721_base::entry::instantiate, + cw721_base::entry::query, + ) + .with_migrate(cw721_base::entry::migrate); + Box::new(contract) +} + +pub fn cw721_roles_contract() -> Box> { + let contract = ContractWrapper::new( + cw721_roles::contract::execute, + cw721_roles::contract::instantiate, + cw721_roles::contract::query, + ); + Box::new(contract) +} + +pub fn cw20_stake_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake::contract::execute, + cw20_stake::contract::instantiate, + cw20_stake::contract::query, + ) + .with_migrate(cw20_stake::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_condorcet_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_condorcet::contract::execute, + dao_proposal_condorcet::contract::instantiate, + dao_proposal_condorcet::contract::query, + ) + .with_reply(dao_proposal_condorcet::contract::reply); + Box::new(contract) +} + +pub fn dao_proposal_single_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_single::contract::execute, + dao_proposal_single::contract::instantiate, + dao_proposal_single::contract::query, + ) + .with_reply(dao_proposal_single::contract::reply) + .with_migrate(dao_proposal_single::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_multiple_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_multiple::contract::execute, + dao_proposal_multiple::contract::instantiate, + dao_proposal_multiple::contract::query, + ) + .with_reply(dao_proposal_multiple::contract::reply) + .with_migrate(dao_proposal_multiple::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_sudo_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_sudo::contract::execute, + dao_proposal_sudo::contract::instantiate, + dao_proposal_sudo::contract::query, + ); + Box::new(contract) +} + +pub fn dao_pre_propose_approver_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_approver::contract::execute, + dao_pre_propose_approver::contract::instantiate, + dao_pre_propose_approver::contract::query, + ) + .with_migrate(dao_pre_propose_approver::contract::migrate); + Box::new(contract) +} + +pub fn dao_pre_propose_single_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_single::contract::execute, + dao_pre_propose_single::contract::instantiate, + dao_pre_propose_single::contract::query, + ) + .with_migrate(dao_pre_propose_single::contract::migrate); + Box::new(contract) +} + +pub fn dao_pre_propose_multiple_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_multiple::contract::execute, + dao_pre_propose_multiple::contract::instantiate, + dao_pre_propose_multiple::contract::query, + ) + .with_migrate(dao_pre_propose_multiple::contract::migrate); + Box::new(contract) +} + +pub fn dao_pre_propose_approval_single_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_approval_single::contract::execute, + dao_pre_propose_approval_single::contract::instantiate, + dao_pre_propose_approval_single::contract::query, + ) + .with_migrate(dao_pre_propose_approval_single::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw4_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw4::contract::execute, + dao_voting_cw4::contract::instantiate, + dao_voting_cw4::contract::query, + ) + .with_reply(dao_voting_cw4::contract::reply) + .with_migrate(dao_voting_cw4::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw20_staked_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw20_staked::contract::execute, + dao_voting_cw20_staked::contract::instantiate, + dao_voting_cw20_staked::contract::query, + ) + .with_reply(dao_voting_cw20_staked::contract::reply) + .with_migrate(dao_voting_cw20_staked::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw20_balance_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw20_balance::contract::execute, + dao_voting_cw20_balance::contract::instantiate, + dao_voting_cw20_balance::contract::query, + ) + .with_reply(dao_voting_cw20_balance::contract::reply); + Box::new(contract) +} + +pub fn dao_voting_token_staked_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_token_staked::contract::execute, + dao_voting_token_staked::contract::instantiate, + dao_voting_token_staked::contract::query, + ) + .with_reply(dao_voting_token_staked::contract::reply) + .with_migrate(dao_voting_token_staked::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw721_staked_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw721_staked::contract::execute, + dao_voting_cw721_staked::contract::instantiate, + dao_voting_cw721_staked::contract::query, + ) + .with_reply(dao_voting_cw721_staked::contract::reply) + .with_migrate(dao_voting_cw721_staked::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw721_roles_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw721_roles::contract::execute, + dao_voting_cw721_roles::contract::instantiate, + dao_voting_cw721_roles::contract::query, + ) + .with_reply(dao_voting_cw721_roles::contract::reply); + Box::new(contract) +} + +pub fn dao_voting_onft_staked_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_onft_staked::contract::execute, + dao_voting_onft_staked::contract::instantiate, + dao_voting_onft_staked::contract::query, + ) + .with_migrate(dao_voting_onft_staked::contract::migrate); + Box::new(contract) +} + +pub fn dao_dao_core_contract() -> Box> { + let contract = ContractWrapper::new( + dao_dao_core::contract::execute, + dao_dao_core::contract::instantiate, + dao_dao_core::contract::query, + ) + .with_reply(dao_dao_core::contract::reply) + .with_migrate(dao_dao_core::contract::migrate); + Box::new(contract) +} + +pub fn dao_migrator_contract() -> Box> { + let contract = ContractWrapper::new( + dao_migrator::contract::execute, + dao_migrator::contract::instantiate, + dao_migrator::contract::query, + ) + .with_reply(dao_migrator::contract::reply); + Box::new(contract) +} + +pub fn cw_vesting_contract() -> Box> { + let contract = ContractWrapper::new( + cw_vesting::contract::execute, + cw_vesting::contract::instantiate, + cw_vesting::contract::query, + ); + Box::new(contract) +} + +pub fn dao_test_custom_factory_contract() -> Box> { + let contract = ContractWrapper::new( + dao_test_custom_factory::contract::execute, + dao_test_custom_factory::contract::instantiate, + dao_test_custom_factory::contract::query, + ) + .with_reply(dao_test_custom_factory::contract::reply); + Box::new(contract) +} + +pub fn cw_fund_distributor_contract() -> Box> { + let contract = ContractWrapper::new( + cw_fund_distributor::contract::execute, + cw_fund_distributor::contract::instantiate, + cw_fund_distributor::contract::query, + ) + .with_migrate(cw_fund_distributor::contract::migrate); + Box::new(contract) +} + +pub fn dao_rewards_distributor_contract() -> Box> { + let contract = ContractWrapper::new( + dao_rewards_distributor::contract::execute, + dao_rewards_distributor::contract::instantiate, + dao_rewards_distributor::contract::query, + ) + .with_migrate(dao_rewards_distributor::contract::migrate); + Box::new(contract) +} + +pub fn btsg_ft_factory_contract() -> Box> { + let contract = ContractWrapper::new( + btsg_ft_factory::contract::execute, + btsg_ft_factory::contract::instantiate, + btsg_ft_factory::contract::query, + ) + .with_reply(btsg_ft_factory::contract::reply) + .with_migrate(btsg_ft_factory::contract::migrate); + Box::new(contract) +} + +pub fn cw_admin_factory_contract() -> Box> { + let contract = ContractWrapper::new( + cw_admin_factory::contract::execute, + cw_admin_factory::contract::instantiate, + cw_admin_factory::contract::query, + ) + .with_reply(cw_admin_factory::contract::reply) + .with_migrate(cw_admin_factory::contract::migrate); + Box::new(contract) +} + +pub fn cw_payroll_factory_contract() -> Box> { + let contract = ContractWrapper::new( + cw_payroll_factory::contract::execute, + cw_payroll_factory::contract::instantiate, + cw_payroll_factory::contract::query, + ) + .with_reply(cw_payroll_factory::contract::reply); + Box::new(contract) +} + +pub fn cw_token_swap_contract() -> Box> { + let contract = ContractWrapper::new( + cw_token_swap::contract::execute, + cw_token_swap::contract::instantiate, + cw_token_swap::contract::query, + ) + .with_migrate(cw_token_swap::contract::migrate); + Box::new(contract) +} + +pub fn cw20_stake_external_rewards_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake_external_rewards::contract::execute, + cw20_stake_external_rewards::contract::instantiate, + cw20_stake_external_rewards::contract::query, + ) + .with_migrate(cw20_stake_external_rewards::contract::migrate); + Box::new(contract) +} + +pub fn cw20_stake_reward_distributor_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake_reward_distributor::contract::execute, + cw20_stake_reward_distributor::contract::instantiate, + cw20_stake_reward_distributor::contract::query, + ) + .with_migrate(cw20_stake_reward_distributor::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_hook_counter_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_hook_counter::contract::execute, + dao_proposal_hook_counter::contract::instantiate, + dao_proposal_hook_counter::contract::query, + ); + Box::new(contract) +} diff --git a/packages/dao-testing/src/contracts/mod.rs b/packages/dao-testing/src/contracts/mod.rs new file mode 100644 index 000000000..51019ef32 --- /dev/null +++ b/packages/dao-testing/src/contracts/mod.rs @@ -0,0 +1,6 @@ +mod latest; + +pub mod v1; +pub mod v241; + +pub use latest::*; diff --git a/packages/dao-testing/src/contracts/v1.rs b/packages/dao-testing/src/contracts/v1.rs new file mode 100644 index 000000000..75751898c --- /dev/null +++ b/packages/dao-testing/src/contracts/v1.rs @@ -0,0 +1,73 @@ +use cosmwasm_std::Empty; +use cw_multi_test::{Contract, ContractWrapper}; + +pub fn cw_proposal_single_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw_proposal_single_v1::contract::execute, + cw_proposal_single_v1::contract::instantiate, + cw_proposal_single_v1::contract::query, + ) + .with_reply(cw_proposal_single_v1::contract::reply) + .with_migrate(cw_proposal_single_v1::contract::migrate); + Box::new(contract) +} + +pub fn cw_core_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw_core_v1::contract::execute, + cw_core_v1::contract::instantiate, + cw_core_v1::contract::query, + ) + .with_reply(cw_core_v1::contract::reply) + .with_migrate(cw_core_v1::contract::migrate); + Box::new(contract) +} + +pub fn cw4_voting_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw4_voting_v1::contract::execute, + cw4_voting_v1::contract::instantiate, + cw4_voting_v1::contract::query, + ) + .with_reply(cw4_voting_v1::contract::reply) + .with_migrate(cw4_voting_v1::contract::migrate); + Box::new(contract) +} + +pub fn cw20_stake_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake_v1::contract::execute, + cw20_stake_v1::contract::instantiate, + cw20_stake_v1::contract::query, + ) + .with_migrate(cw20_stake_v1::contract::migrate); + Box::new(contract) +} + +pub fn stake_cw20_v03_contract() -> Box> { + let contract = ContractWrapper::new( + stake_cw20_v03::contract::execute, + stake_cw20_v03::contract::instantiate, + stake_cw20_v03::contract::query, + ); + Box::new(contract) +} + +pub fn cw20_stake_external_rewards_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake_external_rewards_v1::contract::execute, + cw20_stake_external_rewards_v1::contract::instantiate, + cw20_stake_external_rewards_v1::contract::query, + ) + .with_migrate(cw20_stake_external_rewards_v1::contract::migrate); + Box::new(contract) +} + +pub fn cw20_stake_reward_distributor_v1_contract() -> Box> { + let contract = ContractWrapper::new( + cw20_stake_reward_distributor_v1::contract::execute, + cw20_stake_reward_distributor_v1::contract::instantiate, + cw20_stake_reward_distributor_v1::contract::query, + ); + Box::new(contract) +} diff --git a/packages/dao-testing/src/contracts/v241.rs b/packages/dao-testing/src/contracts/v241.rs new file mode 100644 index 000000000..51d8b69ac --- /dev/null +++ b/packages/dao-testing/src/contracts/v241.rs @@ -0,0 +1,73 @@ +use cosmwasm_std::Empty; +use cw_multi_test::{Contract, ContractWrapper}; + +pub fn dao_dao_core_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_dao_core_v241::contract::execute, + dao_dao_core_v241::contract::instantiate, + dao_dao_core_v241::contract::query, + ) + .with_reply(dao_dao_core_v241::contract::reply) + .with_migrate(dao_dao_core_v241::contract::migrate); + Box::new(contract) +} + +pub fn dao_voting_cw4_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_voting_cw4_v241::contract::execute, + dao_voting_cw4_v241::contract::instantiate, + dao_voting_cw4_v241::contract::query, + ) + .with_reply(dao_voting_cw4_v241::contract::reply) + .with_migrate(dao_voting_cw4_v241::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_single_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_single_v241::contract::execute, + dao_proposal_single_v241::contract::instantiate, + dao_proposal_single_v241::contract::query, + ) + .with_reply(dao_proposal_single_v241::contract::reply) + .with_migrate(dao_proposal_single_v241::contract::migrate); + Box::new(contract) +} + +pub fn dao_proposal_multiple_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_proposal_multiple_v241::contract::execute, + dao_proposal_multiple_v241::contract::instantiate, + dao_proposal_multiple_v241::contract::query, + ) + .with_reply(dao_proposal_multiple_v241::contract::reply) + .with_migrate(dao_proposal_multiple_v241::contract::migrate); + Box::new(contract) +} + +pub fn dao_pre_propose_single_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_single_v241::contract::execute, + dao_pre_propose_single_v241::contract::instantiate, + dao_pre_propose_single_v241::contract::query, + ); + Box::new(contract) +} + +pub fn dao_pre_propose_approval_single_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_approval_single_v241::contract::execute, + dao_pre_propose_approval_single_v241::contract::instantiate, + dao_pre_propose_approval_single_v241::contract::query, + ); + Box::new(contract) +} + +pub fn dao_pre_propose_multiple_v241_contract() -> Box> { + let contract = ContractWrapper::new( + dao_pre_propose_multiple_v241::contract::execute, + dao_pre_propose_multiple_v241::contract::instantiate, + dao_pre_propose_multiple_v241::contract::query, + ); + Box::new(contract) +} diff --git a/packages/dao-testing/src/helpers.rs b/packages/dao-testing/src/helpers.rs index b629e7ba0..e44c0a787 100644 --- a/packages/dao-testing/src/helpers.rs +++ b/packages/dao-testing/src/helpers.rs @@ -7,9 +7,8 @@ use dao_voting::threshold::ActiveThreshold; use dao_voting_cw4::msg::GroupContract; use crate::contracts::{ - cw20_balances_voting_contract, cw20_base_contract, cw20_stake_contract, - cw20_staked_balances_voting_contract, cw4_group_contract, dao_dao_contract, - dao_voting_cw4_contract, + cw20_base_contract, cw20_stake_contract, cw4_group_contract, dao_dao_core_contract, + dao_voting_cw20_balance_contract, dao_voting_cw20_staked_contract, dao_voting_cw4_contract, }; const CREATOR_ADDR: &str = "creator"; @@ -21,8 +20,8 @@ pub fn instantiate_with_cw20_balances_governance( initial_balances: Option>, ) -> Addr { let cw20_id = app.store_code(cw20_base_contract()); - let core_id = app.store_code(dao_dao_contract()); - let votemod_id = app.store_code(cw20_balances_voting_contract()); + let core_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_balance_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![Cw20Coin { @@ -125,8 +124,8 @@ pub fn instantiate_with_staked_balances_governance( let cw20_id = app.store_code(cw20_base_contract()); let cw20_stake_id = app.store_code(cw20_stake_contract()); - let staked_balances_voting_id = app.store_code(cw20_staked_balances_voting_contract()); - let core_contract_id = app.store_code(dao_dao_contract()); + let staked_balances_voting_id = app.store_code(dao_voting_cw20_staked_contract()); + let core_contract_id = app.store_code(dao_dao_core_contract()); let instantiate_core = dao_interface::msg::InstantiateMsg { dao_uri: None, @@ -233,8 +232,8 @@ pub fn instantiate_with_staking_active_threshold( ) -> Addr { let cw20_id = app.store_code(cw20_base_contract()); let cw20_staking_id = app.store_code(cw20_stake_contract()); - let governance_id = app.store_code(dao_dao_contract()); - let votemod_id = app.store_code(cw20_staked_balances_voting_contract()); + let governance_id = app.store_code(dao_dao_core_contract()); + let votemod_id = app.store_code(dao_voting_cw20_staked_contract()); let initial_balances = initial_balances.unwrap_or_else(|| { vec![ @@ -307,7 +306,7 @@ pub fn instantiate_with_cw4_groups_governance( initial_weights: Option>, ) -> Addr { let cw4_id = app.store_code(cw4_group_contract()); - let core_id = app.store_code(dao_dao_contract()); + let core_id = app.store_code(dao_dao_core_contract()); let votemod_id = app.store_code(dao_voting_cw4_contract()); let initial_weights = initial_weights.unwrap_or_default(); diff --git a/packages/dao-testing/src/lib.rs b/packages/dao-testing/src/lib.rs index eeb38e678..e0985b0fc 100644 --- a/packages/dao-testing/src/lib.rs +++ b/packages/dao-testing/src/lib.rs @@ -1,16 +1,20 @@ #![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md"))] -#[cfg(not(target_arch = "wasm32"))] -pub mod tests; - #[cfg(not(target_arch = "wasm32"))] pub mod helpers; #[cfg(not(target_arch = "wasm32"))] pub mod contracts; +#[cfg(not(target_arch = "wasm32"))] +pub mod tests; #[cfg(not(target_arch = "wasm32"))] pub use tests::*; +#[cfg(not(target_arch = "wasm32"))] +pub mod suite; +#[cfg(not(target_arch = "wasm32"))] +pub use suite::*; + #[cfg(not(target_arch = "wasm32"))] pub mod test_tube; diff --git a/packages/dao-testing/src/suite/base.rs b/packages/dao-testing/src/suite/base.rs new file mode 100644 index 000000000..85ec6d559 --- /dev/null +++ b/packages/dao-testing/src/suite/base.rs @@ -0,0 +1,353 @@ +use cosmwasm_std::{to_json_binary, Addr, Empty, QuerierWrapper, Timestamp}; +use cw20::Cw20Coin; +use cw_multi_test::{App, Executor}; +use cw_utils::Duration; + +use super::*; +use crate::contracts::*; + +#[derive(Clone, Debug)] +pub struct TestDao { + pub core_addr: Addr, + pub voting_module_addr: Addr, + pub proposal_modules: Vec, + pub x: Extra, +} + +pub struct DaoTestingSuiteBase { + pub app: App, + + // Code IDs + // DAO stuff + pub core_id: u64, + pub admin_factory_id: u64, + pub proposal_single_id: u64, + pub proposal_multiple_id: u64, + pub proposal_sudo_id: u64, + pub pre_propose_approval_single_id: u64, + pub pre_propose_single_id: u64, + pub pre_propose_multiple_id: u64, + pub pre_propose_approver_id: u64, + pub voting_cw4_id: u64, + pub voting_cw20_staked_id: u64, + pub voting_cw20_balance_id: u64, + pub voting_cw721_staked_id: u64, + pub voting_token_staked_id: u64, + pub cw20_stake_id: u64, + pub rewards_distributor_id: u64, + // External stuff + pub cw4_group_id: u64, + pub cw20_base_id: u64, + pub cw721_base_id: u64, + + // Addresses + pub admin_factory_addr: Addr, +} + +pub trait DaoTestingSuite { + /// get the testing suite base + fn base(&self) -> &DaoTestingSuiteBase; + + /// get the mutable testing suite base + fn base_mut(&mut self) -> &mut DaoTestingSuiteBase; + + /// get the voting module info to instantiate the DAO with + fn get_voting_module_info(&self) -> dao_interface::state::ModuleInstantiateInfo; + + /// get the extra DAO fields + fn get_dao_extra(&self, _dao: &TestDao) -> Extra; + + /// perform additional setup for the DAO after it is created. empty default + /// implementation makes this optional. + fn dao_setup(&mut self, _dao: &mut TestDao) {} + + /// build the DAO. no need to override this. + fn dao(&mut self) -> TestDao { + let voting_module_info = self.get_voting_module_info(); + + let proposal_module_infos = + vec![dao_interface::state::ModuleInstantiateInfo { + code_id: self.base().proposal_single_id, + msg: to_json_binary(&dao_proposal_single::msg::InstantiateMsg { + threshold: dao_voting::threshold::Threshold::AbsolutePercentage { + percentage: dao_voting::threshold::PercentageThreshold::Majority {}, + }, + max_voting_period: Duration::Height(10), + min_voting_period: None, + only_members_execute: true, + allow_revoting: false, + pre_propose_info: dao_voting::pre_propose::PreProposeInfo::ModuleMayPropose { + info: dao_interface::state::ModuleInstantiateInfo { + code_id: self.base().pre_propose_single_id, + msg: to_json_binary(&dao_pre_propose_single::InstantiateMsg { + deposit_info: None, + submission_policy: + dao_voting::pre_propose::PreProposeSubmissionPolicy::Specific { + dao_members: true, + allowlist: vec![], + denylist: vec![], + }, + extension: Empty {}, + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "single choice pre-propose module".to_string(), + }, + }, + close_proposal_on_execution_failure: true, + veto: None, + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "single choice proposal module".to_string(), + }, + dao_interface::state::ModuleInstantiateInfo { + code_id: self.base().proposal_multiple_id, + msg: to_json_binary(&dao_proposal_multiple::msg::InstantiateMsg { + voting_strategy: dao_voting::multiple_choice::VotingStrategy::SingleChoice { + quorum: dao_voting::threshold::PercentageThreshold::Majority {}, + }, + max_voting_period: Duration::Height(10), + min_voting_period: None, + only_members_execute: true, + allow_revoting: false, + pre_propose_info: dao_voting::pre_propose::PreProposeInfo::ModuleMayPropose { + info: dao_interface::state::ModuleInstantiateInfo { + code_id: self.base().pre_propose_multiple_id, + msg: to_json_binary(&dao_pre_propose_multiple::InstantiateMsg { + deposit_info: None, + submission_policy: + dao_voting::pre_propose::PreProposeSubmissionPolicy::Specific { + dao_members: true, + allowlist: vec![], + denylist: vec![], + }, + extension: Empty {}, + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "multiple choice pre-propose module".to_string(), + }, + }, + close_proposal_on_execution_failure: true, + veto: None, + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "multiple choice proposal module".to_string(), + }]; + + // create the DAO using the base testing suite + let dao = self + .base_mut() + .build(voting_module_info, proposal_module_infos); + + // perform additional queries to get extra fields for DAO struct + let x = self.get_dao_extra(&dao); + + let mut dao = TestDao { + core_addr: dao.core_addr, + voting_module_addr: dao.voting_module_addr, + proposal_modules: dao.proposal_modules, + x, + }; + + // perform additional setup after the DAO is created + self.dao_setup(&mut dao); + + dao + } + + /// get the app querier + fn querier(&self) -> QuerierWrapper<'_> { + self.base().app.wrap() + } +} + +// CONSTRUCTOR +impl DaoTestingSuiteBase { + pub fn base() -> Self { + let mut app = App::default(); + + // start at 0 height and time + app.update_block(|b| { + b.height = 0; + b.time = Timestamp::from_seconds(0); + }); + + let core_id = app.store_code(dao_dao_core_contract()); + let admin_factory_id = app.store_code(cw_admin_factory_contract()); + let proposal_single_id = app.store_code(dao_proposal_single_contract()); + let proposal_multiple_id = app.store_code(dao_proposal_multiple_contract()); + let proposal_sudo_id = app.store_code(dao_proposal_sudo_contract()); + let pre_propose_approval_single_id = + app.store_code(dao_pre_propose_approval_single_contract()); + let pre_propose_single_id = app.store_code(dao_pre_propose_single_contract()); + let pre_propose_multiple_id = app.store_code(dao_pre_propose_multiple_contract()); + let pre_propose_approver_id = app.store_code(dao_pre_propose_approver_contract()); + let voting_cw4_id = app.store_code(dao_voting_cw4_contract()); + let voting_cw20_staked_id = app.store_code(dao_voting_cw20_staked_contract()); + let voting_cw20_balance_id = app.store_code(dao_voting_cw20_balance_contract()); + let voting_cw721_staked_id = app.store_code(dao_voting_cw721_staked_contract()); + let voting_token_staked_id = app.store_code(dao_voting_token_staked_contract()); + let cw20_stake_id = app.store_code(cw20_stake_contract()); + let rewards_distributor_id = app.store_code(dao_rewards_distributor_contract()); + + let cw4_group_id = app.store_code(cw4_group_contract()); + let cw20_base_id = app.store_code(cw20_base_contract()); + let cw721_base_id = app.store_code(cw721_base_contract()); + + let admin_factory_addr = app + .instantiate_contract( + admin_factory_id, + Addr::unchecked(OWNER), + &cw_admin_factory::msg::InstantiateMsg { admin: None }, + &[], + "admin factory", + None, + ) + .unwrap(); + + Self { + app, + + core_id, + admin_factory_id, + proposal_single_id, + proposal_multiple_id, + proposal_sudo_id, + pre_propose_approval_single_id, + pre_propose_single_id, + pre_propose_multiple_id, + pre_propose_approver_id, + voting_cw4_id, + voting_cw20_staked_id, + voting_cw20_balance_id, + voting_cw721_staked_id, + voting_token_staked_id, + cw20_stake_id, + rewards_distributor_id, + cw4_group_id, + cw20_base_id, + cw721_base_id, + + admin_factory_addr, + } + } + + pub fn instantiate_cw20(&mut self, name: &str, initial_balances: Vec) -> Addr { + self.app + .instantiate_contract( + self.cw20_base_id, + Addr::unchecked(OWNER), + &cw20_base::msg::InstantiateMsg { + name: name.to_string(), + symbol: name.to_string(), + decimals: 6, + initial_balances, + mint: None, + marketing: None, + }, + &[], + "cw20", + None, + ) + .unwrap() + } +} + +// DAO CREATION +impl DaoTestingSuiteBase { + pub fn build( + &mut self, + voting_module_instantiate_info: dao_interface::state::ModuleInstantiateInfo, + proposal_modules_instantiate_info: Vec, + ) -> TestDao { + let init = dao_interface::msg::InstantiateMsg { + admin: None, + name: "DAO DAO".to_string(), + description: "A DAO that builds DAOs.".to_string(), + image_url: None, + automatically_add_cw20s: false, + automatically_add_cw721s: false, + voting_module_instantiate_info, + proposal_modules_instantiate_info, + initial_items: None, + dao_uri: None, + }; + + let res = self + .app + .execute_contract( + Addr::unchecked(OWNER), + self.admin_factory_addr.clone(), + &cw_admin_factory::msg::ExecuteMsg::InstantiateContractWithSelfAdmin { + instantiate_msg: to_json_binary(&init).unwrap(), + code_id: self.core_id, + label: "DAO DAO".to_string(), + }, + &[], + ) + .unwrap(); + + // get core address from the instantiate event + let instantiate_event = &res.events[2]; + assert_eq!(instantiate_event.ty, "instantiate"); + let core = Addr::unchecked(instantiate_event.attributes[0].value.clone()); + + // get voting module address + let voting_module: Addr = self + .app + .wrap() + .query_wasm_smart(&core, &dao_interface::msg::QueryMsg::VotingModule {}) + .unwrap(); + + // get proposal modules + let proposal_modules: Vec = self + .app + .wrap() + .query_wasm_smart( + &core, + &dao_interface::msg::QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + + TestDao { + core_addr: core, + voting_module_addr: voting_module, + proposal_modules, + x: Empty::default(), + } + } + + pub fn cw4(&mut self) -> DaoTestingSuiteCw4 { + DaoTestingSuiteCw4::new(self) + } + + pub fn cw20(&mut self) -> DaoTestingSuiteCw20 { + DaoTestingSuiteCw20::new(self) + } + + pub fn cw721(&mut self) -> DaoTestingSuiteCw721 { + DaoTestingSuiteCw721::new(self) + } + + pub fn token(&mut self) -> DaoTestingSuiteToken { + DaoTestingSuiteToken::new(self) + } +} + +// UTILITIES +impl DaoTestingSuiteBase { + /// advance the block height by one + pub fn advance_block(&mut self) { + self.app.update_block(|b| b.height += 1); + } +} diff --git a/packages/dao-testing/src/suite/cw20_suite.rs b/packages/dao-testing/src/suite/cw20_suite.rs new file mode 100644 index 000000000..a26b0b34e --- /dev/null +++ b/packages/dao-testing/src/suite/cw20_suite.rs @@ -0,0 +1,269 @@ +use cosmwasm_std::{to_json_binary, Addr, Uint128}; +use cw20::Cw20Coin; +use cw_utils::Duration; + +use super::*; + +pub struct DaoTestingSuiteCw20<'a> { + pub base: &'a mut DaoTestingSuiteBase, + + pub initial_balances: Vec, + pub initial_dao_balance: Uint128, + pub unstaking_duration: Option, + pub active_threshold: Option, +} + +#[derive(Clone, Debug)] +pub struct Cw20DaoExtra { + pub cw20_addr: Addr, + pub staking_addr: Addr, +} + +pub type Cw20TestDao = TestDao; + +impl<'a> DaoTestingSuiteCw20<'a> { + pub fn new(base: &'a mut DaoTestingSuiteBase) -> Self { + Self { + base, + + initial_balances: vec![ + Cw20Coin { + address: MEMBER1.to_string(), + amount: Uint128::new(100), + }, + Cw20Coin { + address: MEMBER2.to_string(), + amount: Uint128::new(200), + }, + Cw20Coin { + address: MEMBER3.to_string(), + amount: Uint128::new(300), + }, + Cw20Coin { + address: MEMBER4.to_string(), + amount: Uint128::new(300), + }, + Cw20Coin { + address: MEMBER5.to_string(), + amount: Uint128::new(100), + }, + ], + initial_dao_balance: Uint128::new(10000), + unstaking_duration: None, + active_threshold: None, + } + } + + pub fn with_initial_balances(&mut self, initial_balances: Vec) -> &mut Self { + self.initial_balances = initial_balances; + self + } + + pub fn with_initial_dao_balance( + &mut self, + initial_dao_balance: impl Into, + ) -> &mut Self { + self.initial_dao_balance = initial_dao_balance.into(); + self + } + + pub fn with_unstaking_duration(&mut self, unstaking_duration: Option) -> &mut Self { + self.unstaking_duration = unstaking_duration; + self + } + + pub fn with_active_threshold( + &mut self, + active_threshold: Option, + ) -> &mut Self { + self.active_threshold = active_threshold; + self + } + + /// stake tokens + pub fn stake( + &mut self, + dao: &Cw20TestDao, + staker: impl Into, + amount: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.x.cw20_addr.clone(), + &cw20::Cw20ExecuteMsg::Send { + contract: dao.x.staking_addr.to_string(), + amount: amount.into(), + msg: to_json_binary(&cw20_stake::msg::ReceiveMsg::Stake {}).unwrap(), + }, + &[], + ) + .unwrap(); + } + + /// unstake tokens + pub fn unstake( + &mut self, + dao: &Cw20TestDao, + staker: impl Into, + amount: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.x.staking_addr.clone(), + &cw20_stake::msg::ExecuteMsg::Unstake { + amount: amount.into(), + }, + &[], + ) + .unwrap(); + } + + /// stake all initial balances and progress one block + pub fn stake_all_initial(&mut self, dao: &Cw20TestDao) { + for member in self.initial_balances.clone() { + self.stake(dao, member.address, member.amount); + } + + // staking takes effect at the next block + self.base.advance_block(); + } +} + +impl<'a> DaoTestingSuite for DaoTestingSuiteCw20<'a> { + fn base(&self) -> &DaoTestingSuiteBase { + self.base + } + + fn base_mut(&mut self) -> &mut DaoTestingSuiteBase { + self.base + } + + fn get_voting_module_info(&self) -> dao_interface::state::ModuleInstantiateInfo { + dao_interface::state::ModuleInstantiateInfo { + code_id: self.base.voting_cw20_staked_id, + msg: to_json_binary(&dao_voting_cw20_staked::msg::InstantiateMsg { + token_info: dao_voting_cw20_staked::msg::TokenInfo::New { + code_id: self.base.cw20_base_id, + label: "voting token".to_string(), + name: "Voting Token".to_string(), + symbol: "VOTE".to_string(), + decimals: 6, + initial_balances: self.initial_balances.clone(), + marketing: None, + staking_code_id: self.base.cw20_stake_id, + unstaking_duration: self.unstaking_duration, + initial_dao_balance: Some(self.initial_dao_balance), + }, + active_threshold: self.active_threshold.clone(), + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + } + } + + fn get_dao_extra(&self, dao: &TestDao) -> Cw20DaoExtra { + let cw20_addr: Addr = self + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw20_staked::msg::QueryMsg::TokenContract {}, + ) + .unwrap(); + let staking_addr: Addr = self + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw20_staked::msg::QueryMsg::StakingContract {}, + ) + .unwrap(); + + Cw20DaoExtra { + cw20_addr, + staking_addr, + } + } + + /// stake all initial balances and progress one block + fn dao_setup(&mut self, dao: &mut Cw20TestDao) { + for member in self.initial_balances.clone() { + self.stake(dao, member.address, member.amount); + } + + // staking takes effect at the next block + self.base.advance_block(); + } +} + +#[cfg(test)] +mod tests { + use cosmwasm_std::Uint128; + + use super::*; + + #[test] + fn dao_testing_suite_cw20() { + let mut suite = DaoTestingSuiteBase::base(); + let mut suite = suite.cw20(); + let dao = suite.dao(); + + let voting_module: Addr = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::VotingModule {}, + ) + .unwrap(); + assert_eq!(voting_module, dao.voting_module_addr); + + let proposal_modules: Vec = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(proposal_modules.len(), 2); + + let cw20_addr: Addr = suite + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw20_staked::msg::QueryMsg::TokenContract {}, + ) + .unwrap(); + assert_eq!(cw20_addr, dao.x.cw20_addr); + + let staking_addr: Addr = suite + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw20_staked::msg::QueryMsg::StakingContract {}, + ) + .unwrap(); + assert_eq!(staking_addr, dao.x.staking_addr); + + let total_weight: dao_interface::voting::TotalPowerAtHeightResponse = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::TotalPowerAtHeight { height: None }, + ) + .unwrap(); + assert_eq!( + total_weight.power, + suite + .initial_balances + .iter() + .fold(Uint128::zero(), |acc, m| acc + m.amount) + ); + } +} diff --git a/packages/dao-testing/src/suite/cw4_suite.rs b/packages/dao-testing/src/suite/cw4_suite.rs new file mode 100644 index 000000000..d3a37c1a7 --- /dev/null +++ b/packages/dao-testing/src/suite/cw4_suite.rs @@ -0,0 +1,148 @@ +use cosmwasm_std::{to_json_binary, Addr}; + +use super::*; + +pub struct DaoTestingSuiteCw4<'a> { + pub base: &'a mut DaoTestingSuiteBase, + + pub members: Vec, +} + +#[derive(Clone, Debug)] +pub struct Cw4DaoExtra { + pub group_addr: Addr, +} + +pub type Cw4TestDao = TestDao; + +impl<'a> DaoTestingSuiteCw4<'a> { + pub fn new(base: &'a mut DaoTestingSuiteBase) -> Self { + Self { + base, + members: vec![ + cw4::Member { + addr: MEMBER1.to_string(), + weight: 1, + }, + cw4::Member { + addr: MEMBER2.to_string(), + weight: 2, + }, + cw4::Member { + addr: MEMBER3.to_string(), + weight: 3, + }, + cw4::Member { + addr: MEMBER4.to_string(), + weight: 3, + }, + cw4::Member { + addr: MEMBER5.to_string(), + weight: 1, + }, + ], + } + } + + pub fn with_members(&mut self, members: Vec) -> &mut Self { + self.members = members; + self + } +} + +impl<'a> DaoTestingSuite for DaoTestingSuiteCw4<'a> { + fn base(&self) -> &DaoTestingSuiteBase { + self.base + } + + fn base_mut(&mut self) -> &mut DaoTestingSuiteBase { + self.base + } + + fn get_voting_module_info(&self) -> dao_interface::state::ModuleInstantiateInfo { + dao_interface::state::ModuleInstantiateInfo { + code_id: self.base.voting_cw4_id, + msg: to_json_binary(&dao_voting_cw4::msg::InstantiateMsg { + group_contract: dao_voting_cw4::msg::GroupContract::New { + cw4_group_code_id: self.base.cw4_group_id, + initial_members: self.members.clone(), + }, + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + } + } + + fn get_dao_extra(&self, dao: &TestDao) -> Cw4DaoExtra { + let group_addr: Addr = self + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw4::msg::QueryMsg::GroupContract {}, + ) + .unwrap(); + + Cw4DaoExtra { group_addr } + } +} + +#[cfg(test)] +mod tests { + use cosmwasm_std::Uint128; + + use super::*; + + #[test] + fn dao_testing_suite_cw4() { + let mut suite = DaoTestingSuiteBase::base(); + let mut suite = suite.cw4(); + let dao = suite.dao(); + + let voting_module: Addr = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::VotingModule {}, + ) + .unwrap(); + assert_eq!(voting_module, dao.voting_module_addr); + + let proposal_modules: Vec = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(proposal_modules.len(), 2); + + let group_addr: Addr = suite + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw4::msg::QueryMsg::GroupContract {}, + ) + .unwrap(); + assert_eq!(group_addr, dao.x.group_addr); + + let total_weight: dao_interface::voting::TotalPowerAtHeightResponse = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::TotalPowerAtHeight { height: None }, + ) + .unwrap(); + assert_eq!( + total_weight.power, + suite + .members + .iter() + .fold(Uint128::zero(), |acc, m| acc + Uint128::from(m.weight)) + ); + } +} diff --git a/packages/dao-testing/src/suite/cw721_suite.rs b/packages/dao-testing/src/suite/cw721_suite.rs new file mode 100644 index 000000000..001f20c06 --- /dev/null +++ b/packages/dao-testing/src/suite/cw721_suite.rs @@ -0,0 +1,246 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{to_json_binary, Addr, Binary, Empty}; +use cw_utils::Duration; + +use super::*; + +#[cw_serde] +pub struct InitialNft { + pub token_id: String, + pub owner: String, +} + +pub struct DaoTestingSuiteCw721<'a> { + pub base: &'a mut DaoTestingSuiteBase, + + pub initial_nfts: Vec, + pub unstaking_duration: Option, + pub active_threshold: Option, +} + +#[derive(Clone, Debug)] +pub struct Cw721DaoExtra { + pub cw721_addr: Addr, +} + +pub type Cw721TestDao = TestDao; + +impl<'a> DaoTestingSuiteCw721<'a> { + pub fn new(base: &'a mut DaoTestingSuiteBase) -> Self { + Self { + base, + + initial_nfts: vec![ + InitialNft { + token_id: "1".to_string(), + owner: MEMBER1.to_string(), + }, + InitialNft { + token_id: "2".to_string(), + owner: MEMBER2.to_string(), + }, + InitialNft { + token_id: "3".to_string(), + owner: MEMBER3.to_string(), + }, + InitialNft { + token_id: "4".to_string(), + owner: MEMBER4.to_string(), + }, + InitialNft { + token_id: "5".to_string(), + owner: MEMBER5.to_string(), + }, + ], + unstaking_duration: None, + active_threshold: None, + } + } + + pub fn with_initial_nfts(&mut self, initial_nfts: Vec) -> &mut Self { + self.initial_nfts = initial_nfts; + self + } + + pub fn with_unstaking_duration(&mut self, unstaking_duration: Option) -> &mut Self { + self.unstaking_duration = unstaking_duration; + self + } + + pub fn with_active_threshold( + &mut self, + active_threshold: Option, + ) -> &mut Self { + self.active_threshold = active_threshold; + self + } + + /// stake NFT + pub fn stake( + &mut self, + dao: &Cw721TestDao, + staker: impl Into, + token_id: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.x.cw721_addr.clone(), + &cw721_base::msg::ExecuteMsg::::SendNft { + contract: dao.voting_module_addr.to_string(), + token_id: token_id.into(), + msg: Binary::default(), + }, + &[], + ) + .unwrap(); + } + + /// unstake NFT + pub fn unstake( + &mut self, + dao: &Cw721TestDao, + staker: impl Into, + token_id: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.voting_module_addr.clone(), + &dao_voting_cw721_staked::msg::ExecuteMsg::Unstake { + token_ids: vec![token_id.into()], + }, + &[], + ) + .unwrap(); + } +} + +impl<'a> DaoTestingSuite for DaoTestingSuiteCw721<'a> { + fn base(&self) -> &DaoTestingSuiteBase { + self.base + } + + fn base_mut(&mut self) -> &mut DaoTestingSuiteBase { + self.base + } + + fn get_voting_module_info(&self) -> dao_interface::state::ModuleInstantiateInfo { + dao_interface::state::ModuleInstantiateInfo { + code_id: self.base.voting_cw721_staked_id, + msg: to_json_binary(&dao_voting_cw721_staked::msg::InstantiateMsg { + nft_contract: dao_voting_cw721_staked::msg::NftContract::New { + code_id: self.base.cw721_base_id, + label: "voting NFT".to_string(), + msg: to_json_binary(&cw721_base::msg::InstantiateMsg { + name: "Voting NFT".to_string(), + symbol: "VOTE".to_string(), + minter: OWNER.to_string(), + }) + .unwrap(), + initial_nfts: self + .initial_nfts + .iter() + .map(|x| { + to_json_binary(&cw721_base::msg::ExecuteMsg::::Mint { + token_id: x.token_id.clone(), + owner: x.owner.clone(), + token_uri: None, + extension: Empty {}, + }) + .unwrap() + }) + .collect(), + }, + unstaking_duration: self.unstaking_duration, + active_threshold: self.active_threshold.clone(), + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + } + } + + fn get_dao_extra(&self, dao: &TestDao) -> Cw721DaoExtra { + let dao_voting_cw721_staked::state::Config { nft_address, .. } = self + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw721_staked::msg::QueryMsg::Config {}, + ) + .unwrap(); + + Cw721DaoExtra { + cw721_addr: nft_address, + } + } + + /// stake all initial NFTs and progress one block + fn dao_setup(&mut self, dao: &mut Cw721TestDao) { + for nft in self.initial_nfts.clone() { + self.stake(dao, nft.owner, nft.token_id); + } + + // staking takes effect at the next block + self.base.advance_block(); + } +} + +#[cfg(test)] +mod tests { + use cosmwasm_std::Uint128; + + use super::*; + + #[test] + fn dao_testing_suite_cw721() { + let mut suite = DaoTestingSuiteBase::base(); + let mut suite = suite.cw721(); + let dao = suite.dao(); + + let voting_module: Addr = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::VotingModule {}, + ) + .unwrap(); + assert_eq!(voting_module, dao.voting_module_addr); + + let proposal_modules: Vec = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(proposal_modules.len(), 2); + + let dao_voting_cw721_staked::state::Config { nft_address, .. } = suite + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_cw721_staked::msg::QueryMsg::Config {}, + ) + .unwrap(); + assert_eq!(nft_address, dao.x.cw721_addr); + + let total_weight: dao_interface::voting::TotalPowerAtHeightResponse = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::TotalPowerAtHeight { height: None }, + ) + .unwrap(); + assert_eq!( + total_weight.power, + Uint128::from(suite.initial_nfts.len() as u128) + ); + } +} diff --git a/packages/dao-testing/src/suite/mod.rs b/packages/dao-testing/src/suite/mod.rs new file mode 100644 index 000000000..312380ede --- /dev/null +++ b/packages/dao-testing/src/suite/mod.rs @@ -0,0 +1,23 @@ +mod base; +mod cw20_suite; +mod cw4_suite; +mod cw721_suite; +mod token_suite; + +pub const OWNER: &str = "owner"; + +pub const MEMBER1: &str = "member1"; +pub const MEMBER2: &str = "member2"; +pub const MEMBER3: &str = "member3"; +pub const MEMBER4: &str = "member4"; +pub const MEMBER5: &str = "member5"; + +pub const GOV_DENOM: &str = "ugovtoken"; + +pub use cw_multi_test::Executor; + +pub use base::*; +pub use cw20_suite::*; +pub use cw4_suite::*; +pub use cw721_suite::*; +pub use token_suite::*; diff --git a/packages/dao-testing/src/suite/token_suite.rs b/packages/dao-testing/src/suite/token_suite.rs new file mode 100644 index 000000000..35e686f70 --- /dev/null +++ b/packages/dao-testing/src/suite/token_suite.rs @@ -0,0 +1,228 @@ +use cosmwasm_std::{coins, to_json_binary, Addr, Uint128}; +use cw_multi_test::{BankSudo, SudoMsg}; +use cw_utils::Duration; +use dao_interface::token::InitialBalance; + +use super::*; + +pub struct DaoTestingSuiteToken<'a> { + pub base: &'a mut DaoTestingSuiteBase, + + pub initial_balances: Vec, + pub unstaking_duration: Option, + pub active_threshold: Option, +} + +#[derive(Clone, Debug)] +pub struct TokenDaoExtra { + pub denom: String, +} + +pub type TokenTestDao = TestDao; + +impl<'a> DaoTestingSuiteToken<'a> { + pub fn new(base: &'a mut DaoTestingSuiteBase) -> Self { + Self { + base, + + initial_balances: vec![ + InitialBalance { + address: MEMBER1.to_string(), + amount: Uint128::new(100), + }, + InitialBalance { + address: MEMBER2.to_string(), + amount: Uint128::new(200), + }, + InitialBalance { + address: MEMBER3.to_string(), + amount: Uint128::new(300), + }, + InitialBalance { + address: MEMBER4.to_string(), + amount: Uint128::new(300), + }, + InitialBalance { + address: MEMBER5.to_string(), + amount: Uint128::new(100), + }, + ], + unstaking_duration: None, + active_threshold: None, + } + } + + pub fn with_initial_balances(&mut self, initial_balances: Vec) -> &mut Self { + self.initial_balances = initial_balances; + self + } + + pub fn with_unstaking_duration(&mut self, unstaking_duration: Option) -> &mut Self { + self.unstaking_duration = unstaking_duration; + self + } + + pub fn with_active_threshold( + &mut self, + active_threshold: Option, + ) -> &mut Self { + self.active_threshold = active_threshold; + self + } + + /// mint tokens + pub fn mint( + &mut self, + dao: &TokenTestDao, + recipient: impl Into, + amount: impl Into, + ) { + self.base + .app + .sudo(SudoMsg::Bank({ + BankSudo::Mint { + to_address: recipient.into(), + amount: coins(amount.into(), &dao.x.denom), + } + })) + .unwrap(); + } + + /// stake tokens + pub fn stake( + &mut self, + dao: &TokenTestDao, + staker: impl Into, + amount: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.voting_module_addr.clone(), + &dao_voting_token_staked::msg::ExecuteMsg::Stake {}, + &coins(amount.into(), &dao.x.denom), + ) + .unwrap(); + } + + /// unstake tokens + pub fn unstake( + &mut self, + dao: &TokenTestDao, + staker: impl Into, + amount: impl Into, + ) { + self.base + .app + .execute_contract( + Addr::unchecked(staker), + dao.voting_module_addr.clone(), + &dao_voting_token_staked::msg::ExecuteMsg::Unstake { + amount: amount.into(), + }, + &[], + ) + .unwrap(); + } +} + +impl<'a> DaoTestingSuite for DaoTestingSuiteToken<'a> { + fn base(&self) -> &DaoTestingSuiteBase { + self.base + } + + fn base_mut(&mut self) -> &mut DaoTestingSuiteBase { + self.base + } + + fn get_voting_module_info(&self) -> dao_interface::state::ModuleInstantiateInfo { + dao_interface::state::ModuleInstantiateInfo { + code_id: self.base.voting_token_staked_id, + msg: to_json_binary(&dao_voting_token_staked::msg::InstantiateMsg { + token_info: dao_voting_token_staked::msg::TokenInfo::Existing { + denom: GOV_DENOM.to_string(), + }, + unstaking_duration: self.unstaking_duration, + active_threshold: self.active_threshold.clone(), + }) + .unwrap(), + admin: Some(dao_interface::state::Admin::CoreModule {}), + funds: vec![], + label: "voting module".to_string(), + } + } + + fn get_dao_extra(&self, dao: &TestDao) -> TokenDaoExtra { + let dao_interface::voting::DenomResponse { denom } = self + .querier() + .query_wasm_smart( + &dao.voting_module_addr, + &dao_voting_token_staked::msg::QueryMsg::Denom {}, + ) + .unwrap(); + + TokenDaoExtra { denom } + } + + /// mint and stake all initial balances and progress one block + fn dao_setup(&mut self, dao: &mut TokenTestDao) { + for member in self.initial_balances.clone() { + self.mint(dao, member.address.clone(), member.amount); + self.stake(dao, member.address, member.amount); + } + + // staking takes effect at the next block + self.base.advance_block(); + } +} + +#[cfg(test)] +mod tests { + use cosmwasm_std::Uint128; + + use super::*; + + #[test] + fn dao_testing_suite_token() { + let mut suite = DaoTestingSuiteBase::base(); + let mut suite = suite.token(); + let dao = suite.dao(); + + let voting_module: Addr = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::VotingModule {}, + ) + .unwrap(); + assert_eq!(voting_module, dao.voting_module_addr); + + let proposal_modules: Vec = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::ProposalModules { + start_after: None, + limit: None, + }, + ) + .unwrap(); + assert_eq!(proposal_modules.len(), 2); + + let total_weight: dao_interface::voting::TotalPowerAtHeightResponse = suite + .querier() + .query_wasm_smart( + &dao.core_addr, + &dao_interface::msg::QueryMsg::TotalPowerAtHeight { height: None }, + ) + .unwrap(); + assert_eq!( + total_weight.power, + suite + .initial_balances + .iter() + .fold(Uint128::zero(), |acc, m| acc + m.amount) + ); + } +} diff --git a/scripts/publish.sh b/scripts/publish.sh index 4eb17e1e6..604440d36 100755 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -31,7 +31,7 @@ START_DIR=$(pwd) # Packages cd packages/cw-denom -cargo publish +cargo hack publish --no-dev-deps --allow-dirty cd "$START_DIR" cd packages/cw-hooks From 83e9a98d7f82067fed307f522b47041aa771da35 Mon Sep 17 00:00:00 2001 From: noah Date: Wed, 30 Oct 2024 18:33:18 -0400 Subject: [PATCH 49/50] fix reward distributor interval delay bug (#891) --- Cargo.lock | 446 +++++++++--------- Cargo.toml | 92 ++-- .../dao-dao-core/schema/dao-dao-core.json | 2 +- .../schema/cw-fund-distributor.json | 2 +- .../schema/dao-rewards-distributor.json | 39 +- .../dao-rewards-distributor/src/contract.rs | 30 +- .../dao-rewards-distributor/src/error.rs | 12 +- .../dao-rewards-distributor/src/helpers.rs | 16 +- .../dao-rewards-distributor/src/msg.rs | 5 +- .../dao-rewards-distributor/src/rewards.rs | 16 +- .../dao-rewards-distributor/src/state.rs | 4 +- .../src/testing/suite.rs | 28 ++ .../src/testing/tests.rs | 125 ++++- .../schema/btsg-ft-factory.json | 2 +- .../schema/cw-admin-factory.json | 2 +- .../schema/cw-payroll-factory.json | 2 +- .../cw-token-swap/schema/cw-token-swap.json | 2 +- .../schema/cw-tokenfactory-issuer.json | 2 +- .../cw-vesting/schema/cw-vesting.json | 2 +- .../cw721-roles/schema/cw721-roles.json | 2 +- .../dao-migrator/schema/dao-migrator.json | 2 +- .../dao-pre-propose-approval-single.json | 2 +- .../schema/dao-pre-propose-approver.json | 2 +- .../schema/dao-pre-propose-multiple.json | 2 +- .../schema/dao-pre-propose-single.json | 2 +- .../schema/dao-proposal-condorcet.json | 2 +- .../schema/dao-proposal-multiple.json | 2 +- .../schema/dao-proposal-single.json | 2 +- .../schema/cw20-stake-external-rewards.json | 2 +- .../schema/cw20-stake-reward-distributor.json | 2 +- .../staking/cw20-stake/schema/cw20-stake.json | 2 +- .../schema/dao-voting-cw20-staked.json | 2 +- .../dao-voting-cw4/schema/dao-voting-cw4.json | 2 +- .../schema/dao-voting-cw721-roles.json | 2 +- .../schema/dao-voting-cw721-staked.json | 2 +- .../schema/dao-voting-onft-staked.json | 2 +- .../schema/dao-voting-token-staked.json | 2 +- 37 files changed, 534 insertions(+), 331 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a4bde71e..600502734 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -271,12 +271,12 @@ dependencies = [ "cw-admin-factory", "cw-utils 1.0.3", "cw20 1.1.2", - "cw20-stake 2.5.0", - "dao-dao-core 2.5.0", - "dao-interface 2.5.0", - "dao-pre-propose-single 2.5.0", - "dao-proposal-single 2.5.0", - "dao-voting 2.5.0", + "cw20-stake 2.5.1", + "dao-dao-core 2.5.1", + "dao-interface 2.5.1", + "dao-pre-propose-single 2.5.1", + "dao-proposal-single 2.5.1", + "dao-voting 2.5.1", "dao-voting-cw20-staked", "env_logger", "serde", @@ -295,7 +295,7 @@ dependencies = [ [[package]] name = "btsg-ft-factory" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -304,11 +304,11 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "dao-dao-core 2.5.0", - "dao-interface 2.5.0", - "dao-proposal-single 2.5.0", + "dao-dao-core 2.5.1", + "dao-interface 2.5.1", + "dao-proposal-single 2.5.1", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-token-staked", "osmosis-std-derive", "prost 0.12.3", @@ -686,7 +686,7 @@ dependencies = [ [[package]] name = "cw-admin-factory" -version = "2.5.0" +version = "2.5.1" dependencies = [ "bech32", "cosmwasm-schema", @@ -698,11 +698,11 @@ dependencies = [ "cw2 1.1.2", "cw20-base 1.1.2", "cw4 1.1.2", - "dao-interface 2.5.0", - "dao-proposal-single 2.5.0", + "dao-interface 2.5.1", + "dao-proposal-single 2.5.1", "dao-testing", - "dao-voting 2.5.0", - "dao-voting-cw4 2.5.0", + "dao-voting 2.5.1", + "dao-voting-cw4 2.5.1", "osmosis-test-tube", "thiserror", ] @@ -831,7 +831,7 @@ dependencies = [ [[package]] name = "cw-denom" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -844,21 +844,21 @@ dependencies = [ [[package]] name = "cw-fund-distributor" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-fund-distributor", "cw-multi-test", - "cw-paginate-storage 2.5.0", + "cw-paginate-storage 2.5.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", - "dao-dao-core 2.5.0", - "dao-interface 2.5.0", + "cw20-stake 2.5.1", + "dao-dao-core 2.5.1", + "dao-interface 2.5.1", "dao-testing", "dao-voting-cw20-staked", "thiserror", @@ -878,7 +878,7 @@ dependencies = [ [[package]] name = "cw-hooks" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -957,7 +957,7 @@ dependencies = [ [[package]] name = "cw-paginate-storage" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-std", "cw-multi-test", @@ -967,11 +967,11 @@ dependencies = [ [[package]] name = "cw-payroll-factory" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-multi-test", "cw-ownable", "cw-payroll-factory", @@ -1013,7 +1013,7 @@ dependencies = [ [[package]] name = "cw-stake-tracker" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1066,7 +1066,7 @@ dependencies = [ [[package]] name = "cw-token-swap" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1083,7 +1083,7 @@ dependencies = [ [[package]] name = "cw-tokenfactory-issuer" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1092,7 +1092,7 @@ dependencies = [ "cw-storage-plus 1.2.0", "cw-tokenfactory-types", "cw2 1.1.2", - "dao-interface 2.5.0", + "dao-interface 2.5.1", "osmosis-std", "osmosis-test-tube", "prost 0.12.3", @@ -1105,11 +1105,11 @@ dependencies = [ [[package]] name = "cw-tokenfactory-types" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "dao-interface 2.5.0", + "dao-interface 2.5.1", "osmosis-std", "osmosis-std-derive", "prost 0.12.3", @@ -1176,12 +1176,12 @@ dependencies = [ [[package]] name = "cw-vesting" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-multi-test", "cw-ownable", "cw-stake-tracker", @@ -1200,7 +1200,7 @@ dependencies = [ [[package]] name = "cw-wormhole" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1367,16 +1367,16 @@ dependencies = [ [[package]] name = "cw20-stake" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-ownable", - "cw-paginate-storage 2.5.0", + "cw-paginate-storage 2.5.1", "cw-storage-plus 1.2.0", "cw-utils 0.13.4", "cw-utils 1.0.3", @@ -1384,16 +1384,16 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 0.2.6", - "cw20-stake 2.5.0", - "dao-hooks 2.5.0", + "cw20-stake 2.5.1", + "dao-hooks 2.5.1", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "thiserror", ] [[package]] name = "cw20-stake-external-rewards" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -1407,9 +1407,9 @@ dependencies = [ "cw20 0.13.4", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw20-stake-external-rewards", - "dao-hooks 2.5.0", + "dao-hooks 2.5.1", "dao-testing", "stake-cw20-external-rewards", "thiserror", @@ -1417,7 +1417,7 @@ dependencies = [ [[package]] name = "cw20-stake-reward-distributor" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1428,7 +1428,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw20-stake-reward-distributor", "dao-testing", "stake-cw20-reward-distributor", @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "cw721-controllers" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1634,7 +1634,7 @@ dependencies = [ [[package]] name = "cw721-roles" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1656,7 +1656,7 @@ dependencies = [ [[package]] name = "dao-cw721-extensions" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1686,13 +1686,13 @@ dependencies = [ [[package]] name = "dao-dao-core" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-core", "cw-multi-test", - "cw-paginate-storage 2.5.0", + "cw-paginate-storage 2.5.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1700,9 +1700,9 @@ dependencies = [ "cw20-base 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-dao-core 2.5.0", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-core 2.5.1", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-proposal-sudo", "dao-testing", "dao-voting-cw20-balance", @@ -1723,13 +1723,13 @@ dependencies = [ [[package]] name = "dao-dao-macros" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.5.0", - "dao-interface 2.5.0", - "dao-voting 2.5.0", + "cw-hooks 2.5.1", + "dao-interface 2.5.1", + "dao-voting 2.5.1", "proc-macro2", "quote", "syn 1.0.109", @@ -1751,14 +1751,14 @@ dependencies = [ [[package]] name = "dao-hooks" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw4 1.1.2", - "dao-pre-propose-base 2.5.0", - "dao-voting 2.5.0", + "dao-pre-propose-base 2.5.1", + "dao-voting 2.5.1", ] [[package]] @@ -1778,7 +1778,7 @@ dependencies = [ [[package]] name = "dao-interface" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -1791,7 +1791,7 @@ dependencies = [ [[package]] name = "dao-migrator" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -1808,19 +1808,19 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 0.2.6", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw20-staked-balance-voting", "cw4 0.13.4", "cw4-voting", - "dao-dao-core 2.5.0", - "dao-interface 2.5.0", + "dao-dao-core 2.5.1", + "dao-interface 2.5.1", "dao-migrator", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-testing", "dao-voting 0.1.0", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "thiserror", ] @@ -1843,13 +1843,13 @@ dependencies = [ [[package]] name = "dao-pre-propose-approval-single" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-multi-test", - "cw-paginate-storage 2.5.0", + "cw-paginate-storage 2.5.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1858,30 +1858,30 @@ dependencies = [ "cw4 1.1.2", "cw4-group 1.1.2", "dao-dao-core 2.4.1", - "dao-dao-core 2.5.0", - "dao-hooks 2.5.0", + "dao-dao-core 2.5.1", + "dao-hooks 2.5.1", "dao-interface 2.4.1", - "dao-interface 2.5.0", + "dao-interface 2.5.1", "dao-pre-propose-approval-single 2.4.1", - "dao-pre-propose-base 2.5.0", + "dao-pre-propose-base 2.5.1", "dao-proposal-single 2.4.1", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-testing", "dao-voting 2.4.1", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "thiserror", ] [[package]] name = "dao-pre-propose-approver" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -1889,16 +1889,16 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw4-group 1.1.2", - "dao-dao-core 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", - "dao-pre-propose-approval-single 2.5.0", - "dao-pre-propose-base 2.5.0", - "dao-proposal-single 2.5.0", + "dao-dao-core 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", + "dao-pre-propose-approval-single 2.5.1", + "dao-pre-propose-base 2.5.1", + "dao-proposal-single 2.5.1", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", ] [[package]] @@ -1922,21 +1922,21 @@ dependencies = [ [[package]] name = "dao-pre-propose-base" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-denom 2.4.1", - "cw-denom 2.5.0", - "cw-hooks 2.5.0", + "cw-denom 2.5.1", + "cw-hooks 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", - "dao-interface 2.5.0", + "dao-interface 2.5.1", "dao-pre-propose-base 2.4.1", "dao-voting 2.4.1", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "semver", "serde", "thiserror", @@ -1957,11 +1957,11 @@ dependencies = [ [[package]] name = "dao-pre-propose-multiple" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-multi-test", "cw-utils 1.0.3", "cw2 1.1.2", @@ -1970,20 +1970,20 @@ dependencies = [ "cw4 1.1.2", "cw4-group 1.1.2", "dao-dao-core 2.4.1", - "dao-dao-core 2.5.0", - "dao-hooks 2.5.0", + "dao-dao-core 2.5.1", + "dao-hooks 2.5.1", "dao-interface 2.4.1", - "dao-interface 2.5.0", - "dao-pre-propose-base 2.5.0", + "dao-interface 2.5.1", + "dao-pre-propose-base 2.5.1", "dao-pre-propose-multiple 2.4.1", "dao-proposal-multiple 2.4.1", - "dao-proposal-multiple 2.5.0", + "dao-proposal-multiple 2.5.1", "dao-testing", "dao-voting 2.4.1", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", ] [[package]] @@ -2001,12 +2001,12 @@ dependencies = [ [[package]] name = "dao-pre-propose-single" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", - "cw-hooks 2.5.0", + "cw-denom 2.5.1", + "cw-hooks 2.5.1", "cw-multi-test", "cw-utils 1.0.3", "cw2 1.1.2", @@ -2015,25 +2015,25 @@ dependencies = [ "cw4 1.1.2", "cw4-group 1.1.2", "dao-dao-core 2.4.1", - "dao-dao-core 2.5.0", - "dao-hooks 2.5.0", + "dao-dao-core 2.5.1", + "dao-hooks 2.5.1", "dao-interface 2.4.1", - "dao-interface 2.5.0", - "dao-pre-propose-base 2.5.0", + "dao-interface 2.5.1", + "dao-pre-propose-base 2.5.1", "dao-pre-propose-single 2.4.1", "dao-proposal-single 2.4.1", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-testing", "dao-voting 2.4.1", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", ] [[package]] name = "dao-proposal-condorcet" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -2044,34 +2044,34 @@ dependencies = [ "cw2 1.1.2", "cw4 1.1.2", "cw4-group 1.1.2", - "dao-dao-core 2.5.0", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-core 2.5.1", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-testing", - "dao-voting 2.5.0", - "dao-voting-cw4 2.5.0", + "dao-voting 2.5.1", + "dao-voting-cw4 2.5.1", "thiserror", ] [[package]] name = "dao-proposal-hook-counter" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "dao-dao-core 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", - "dao-proposal-single 2.5.0", + "dao-dao-core 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", + "dao-proposal-single 2.5.1", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-balance", "thiserror", ] @@ -2101,35 +2101,35 @@ dependencies = [ [[package]] name = "dao-proposal-multiple" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", - "cw-hooks 2.5.0", + "cw-denom 2.5.1", + "cw-hooks 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw4 1.1.2", "cw4-group 1.1.2", "cw721-base 0.18.0", - "dao-dao-macros 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", - "dao-pre-propose-base 2.5.0", - "dao-pre-propose-multiple 2.5.0", - "dao-proposal-multiple 2.5.0", + "dao-dao-macros 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", + "dao-pre-propose-base 2.5.1", + "dao-pre-propose-multiple 2.5.1", + "dao-proposal-multiple 2.5.1", "dao-testing", "dao-voting 0.1.0", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-balance", "dao-voting-cw20-staked", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "dao-voting-cw721-staked", "dao-voting-token-staked", "rand", @@ -2162,14 +2162,14 @@ dependencies = [ [[package]] name = "dao-proposal-single" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cw-core", - "cw-denom 2.5.0", - "cw-hooks 2.5.0", + "cw-denom 2.5.1", + "cw-hooks 2.5.1", "cw-multi-test", "cw-proposal-single", "cw-storage-plus 1.2.0", @@ -2178,23 +2178,23 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw4 1.1.2", "cw4-group 1.1.2", "cw721-base 0.18.0", - "dao-dao-core 2.5.0", - "dao-dao-macros 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", - "dao-pre-propose-base 2.5.0", - "dao-pre-propose-single 2.5.0", - "dao-proposal-single 2.5.0", + "dao-dao-core 2.5.1", + "dao-dao-macros 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", + "dao-pre-propose-base 2.5.1", + "dao-pre-propose-single 2.5.1", + "dao-proposal-single 2.5.1", "dao-testing", "dao-voting 0.1.0", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-balance", "dao-voting-cw20-staked", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "dao-voting-cw721-staked", "dao-voting-token-staked", "thiserror", @@ -2202,21 +2202,21 @@ dependencies = [ [[package]] name = "dao-proposal-sudo" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", "cw-storage-plus 1.2.0", "cw2 1.1.2", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "thiserror", ] [[package]] name = "dao-rewards-distributor" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -2229,17 +2229,17 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw4 1.1.2", "cw4-group 1.1.2", "cw721-base 0.18.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", "dao-rewards-distributor", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "dao-voting-cw721-staked", "dao-voting-token-staked", "semver", @@ -2248,7 +2248,7 @@ dependencies = [ [[package]] name = "dao-test-custom-factory" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2260,15 +2260,15 @@ dependencies = [ "cw2 1.1.2", "cw721 0.18.0", "cw721-base 0.18.0", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", - "dao-voting 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", + "dao-voting 2.5.1", "thiserror", ] [[package]] name = "dao-testing" -version = "2.5.0" +version = "2.5.1" dependencies = [ "btsg-ft-factory", "cosmwasm-schema", @@ -2276,7 +2276,7 @@ dependencies = [ "cw-admin-factory", "cw-core", "cw-fund-distributor", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-payroll-factory", "cw-proposal-single", @@ -2288,7 +2288,7 @@ dependencies = [ "cw20 1.1.2", "cw20-base 1.1.2", "cw20-stake 0.2.6", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw20-stake-external-rewards", "cw20-stake-reward-distributor", "cw4 1.1.2", @@ -2297,33 +2297,33 @@ dependencies = [ "cw721-base 0.18.0", "cw721-roles", "dao-dao-core 2.4.1", - "dao-dao-core 2.5.0", + "dao-dao-core 2.5.1", "dao-interface 2.4.1", - "dao-interface 2.5.0", + "dao-interface 2.5.1", "dao-migrator", "dao-pre-propose-approval-single 2.4.1", - "dao-pre-propose-approval-single 2.5.0", + "dao-pre-propose-approval-single 2.5.1", "dao-pre-propose-approver", "dao-pre-propose-multiple 2.4.1", - "dao-pre-propose-multiple 2.5.0", + "dao-pre-propose-multiple 2.5.1", "dao-pre-propose-single 2.4.1", - "dao-pre-propose-single 2.5.0", + "dao-pre-propose-single 2.5.1", "dao-proposal-condorcet", "dao-proposal-hook-counter", "dao-proposal-multiple 2.4.1", - "dao-proposal-multiple 2.5.0", + "dao-proposal-multiple 2.5.1", "dao-proposal-single 2.4.1", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-proposal-sudo", "dao-rewards-distributor", "dao-test-custom-factory", "dao-voting 0.1.0", "dao-voting 2.4.1", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-balance", "dao-voting-cw20-staked", "dao-voting-cw4 2.4.1", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "dao-voting-cw721-roles", "dao-voting-cw721-staked", "dao-voting-onft-staked", @@ -2369,22 +2369,22 @@ dependencies = [ [[package]] name = "dao-voting" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-denom 2.5.0", + "cw-denom 2.5.1", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw20 1.1.2", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "thiserror", ] [[package]] name = "dao-voting-cw20-balance" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2394,15 +2394,15 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-testing", "thiserror", ] [[package]] name = "dao-voting-cw20-staked" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2412,11 +2412,11 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "cw20-stake 2.5.1", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "thiserror", ] @@ -2440,7 +2440,7 @@ dependencies = [ [[package]] name = "dao-voting-cw4" -version = "2.5.0" +version = "2.5.1" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2450,16 +2450,16 @@ dependencies = [ "cw2 1.1.2", "cw4 1.1.2", "cw4-group 1.1.2", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-testing", - "dao-voting-cw4 2.5.0", + "dao-voting-cw4 2.5.1", "thiserror", ] [[package]] name = "dao-voting-cw721-roles" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", @@ -2475,21 +2475,21 @@ dependencies = [ "cw721-controllers", "cw721-roles", "dao-cw721-extensions", - "dao-dao-macros 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-interface 2.5.1", "dao-testing", "thiserror", ] [[package]] name = "dao-voting-cw721-staked" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", @@ -2497,14 +2497,14 @@ dependencies = [ "cw721 0.18.0", "cw721-base 0.18.0", "cw721-controllers", - "dao-dao-macros 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", "dao-proposal-hook-counter", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-test-custom-factory", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "osmosis-std", "osmosis-test-tube", "serde", @@ -2513,26 +2513,26 @@ dependencies = [ [[package]] name = "dao-voting-onft-staked" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-storage-plus 1.2.0", "cw-utils 1.0.3", "cw2 1.1.2", "cw721-controllers", - "dao-dao-macros 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", "dao-proposal-hook-counter", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-test-custom-factory", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "omniflix-std", "osmosis-test-tube", "prost 0.12.3", @@ -2543,27 +2543,27 @@ dependencies = [ [[package]] name = "dao-voting-token-staked" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cw-controllers 1.1.2", - "cw-hooks 2.5.0", + "cw-hooks 2.5.1", "cw-multi-test", "cw-ownable", "cw-storage-plus 1.2.0", "cw-tokenfactory-issuer", "cw-utils 1.0.3", "cw2 1.1.2", - "dao-dao-macros 2.5.0", - "dao-hooks 2.5.0", - "dao-interface 2.5.0", + "dao-dao-macros 2.5.1", + "dao-hooks 2.5.1", + "dao-interface 2.5.1", "dao-proposal-hook-counter", - "dao-proposal-single 2.5.0", + "dao-proposal-single 2.5.1", "dao-test-custom-factory", "dao-testing", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "osmosis-std", "osmosis-test-tube", "serde", @@ -3251,16 +3251,16 @@ dependencies = [ "cw-vesting", "cw20 1.1.2", "cw20-base 1.1.2", - "cw20-stake 2.5.0", + "cw20-stake 2.5.1", "cw721 0.18.0", "cw721-base 0.18.0", "cw721-roles", - "dao-dao-core 2.5.0", - "dao-interface 2.5.0", - "dao-pre-propose-single 2.5.0", - "dao-proposal-single 2.5.0", + "dao-dao-core 2.5.1", + "dao-interface 2.5.1", + "dao-pre-propose-single 2.5.1", + "dao-proposal-single 2.5.1", "dao-test-custom-factory", - "dao-voting 2.5.0", + "dao-voting 2.5.1", "dao-voting-cw20-staked", "dao-voting-cw721-staked", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index ab164d07e..cc005ca1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ resolver = "2" edition = "2021" license = "BSD-3-Clause" repository = "https://github.com/DA0-DA0/dao-contracts" -version = "2.5.0" +version = "2.5.1" [profile.release] codegen-units = 1 @@ -85,51 +85,51 @@ wynd-utils = "0.4" # optional owner. cw-ownable = "0.5" -btsg-ft-factory = { path = "./contracts/external/btsg-ft-factory", version = "2.5.0" } -cw-admin-factory = { path = "./contracts/external/cw-admin-factory", version = "2.5.0" } -cw-denom = { path = "./packages/cw-denom", version = "2.5.0" } -cw-fund-distributor = { path = "./contracts/distribution/cw-fund-distributor", version = "2.5.0" } -cw-hooks = { path = "./packages/cw-hooks", version = "2.5.0" } -cw-paginate-storage = { path = "./packages/cw-paginate-storage", version = "2.5.0" } -cw-payroll-factory = { path = "./contracts/external/cw-payroll-factory", version = "2.5.0" } -cw-stake-tracker = { path = "./packages/cw-stake-tracker", version = "2.5.0" } -cw-token-swap = { path = "./contracts/external/cw-token-swap", version = "2.5.0" } -cw-tokenfactory-issuer = { path = "./contracts/external/cw-tokenfactory-issuer", version = "2.5.0", default-features = false } -cw-tokenfactory-types = { path = "./packages/cw-tokenfactory-types", version = "2.5.0", default-features = false } -cw-vesting = { path = "./contracts/external/cw-vesting", version = "2.5.0" } -cw-wormhole = { path = "./packages/cw-wormhole", version = "2.5.0" } -cw20-stake = { path = "./contracts/staking/cw20-stake", version = "2.5.0" } -cw20-stake-external-rewards = { path = "./contracts/staking/cw20-stake-external-rewards", version = "2.5.0" } -cw20-stake-reward-distributor = { path = "./contracts/staking/cw20-stake-reward-distributor", version = "2.5.0" } -cw721-controllers = { path = "./packages/cw721-controllers", version = "2.5.0" } -cw721-roles = { path = "./contracts/external/cw721-roles", version = "2.5.0" } -dao-cw721-extensions = { path = "./packages/dao-cw721-extensions", version = "2.5.0" } -dao-dao-core = { path = "./contracts/dao-dao-core", version = "2.5.0" } -dao-dao-macros = { path = "./packages/dao-dao-macros", version = "2.5.0" } -dao-hooks = { path = "./packages/dao-hooks", version = "2.5.0" } -dao-interface = { path = "./packages/dao-interface", version = "2.5.0" } -dao-migrator = { path = "./contracts/external/dao-migrator", version = "2.5.0" } -dao-pre-propose-approval-single = { path = "./contracts/pre-propose/dao-pre-propose-approval-single", version = "2.5.0" } -dao-pre-propose-approver = { path = "./contracts/pre-propose/dao-pre-propose-approver", version = "2.5.0" } -dao-pre-propose-base = { path = "./packages/dao-pre-propose-base", version = "2.5.0" } -dao-pre-propose-multiple = { path = "./contracts/pre-propose/dao-pre-propose-multiple", version = "2.5.0" } -dao-pre-propose-single = { path = "./contracts/pre-propose/dao-pre-propose-single", version = "2.5.0" } -dao-proposal-condorcet = { path = "./contracts/proposal/dao-proposal-condorcet", version = "2.5.0" } -dao-proposal-hook-counter = { path = "./contracts/test/dao-proposal-hook-counter", version = "2.5.0" } -dao-proposal-multiple = { path = "./contracts/proposal/dao-proposal-multiple", version = "2.5.0" } -dao-proposal-single = { path = "./contracts/proposal/dao-proposal-single", version = "2.5.0" } -dao-proposal-sudo = { path = "./contracts/test/dao-proposal-sudo", version = "2.5.0" } -dao-rewards-distributor = { path = "./contracts/distribution/dao-rewards-distributor", version = "2.5.0" } -dao-test-custom-factory = { path = "./contracts/test/dao-test-custom-factory", version = "2.5.0" } -dao-testing = { path = "./packages/dao-testing", version = "2.5.0" } -dao-voting = { path = "./packages/dao-voting", version = "2.5.0" } -dao-voting-cw20-balance = { path = "./contracts/test/dao-voting-cw20-balance", version = "2.5.0" } -dao-voting-cw20-staked = { path = "./contracts/voting/dao-voting-cw20-staked", version = "2.5.0" } -dao-voting-cw4 = { path = "./contracts/voting/dao-voting-cw4", version = "2.5.0" } -dao-voting-cw721-roles = { path = "./contracts/voting/dao-voting-cw721-roles", version = "2.5.0" } -dao-voting-cw721-staked = { path = "./contracts/voting/dao-voting-cw721-staked", version = "2.5.0" } -dao-voting-onft-staked = { path = "./contracts/voting/dao-voting-onft-staked", version = "2.5.0" } -dao-voting-token-staked = { path = "./contracts/voting/dao-voting-token-staked", version = "2.5.0" } +btsg-ft-factory = { path = "./contracts/external/btsg-ft-factory", version = "2.5.1" } +cw-admin-factory = { path = "./contracts/external/cw-admin-factory", version = "2.5.1" } +cw-denom = { path = "./packages/cw-denom", version = "2.5.1" } +cw-fund-distributor = { path = "./contracts/distribution/cw-fund-distributor", version = "2.5.1" } +cw-hooks = { path = "./packages/cw-hooks", version = "2.5.1" } +cw-paginate-storage = { path = "./packages/cw-paginate-storage", version = "2.5.1" } +cw-payroll-factory = { path = "./contracts/external/cw-payroll-factory", version = "2.5.1" } +cw-stake-tracker = { path = "./packages/cw-stake-tracker", version = "2.5.1" } +cw-token-swap = { path = "./contracts/external/cw-token-swap", version = "2.5.1" } +cw-tokenfactory-issuer = { path = "./contracts/external/cw-tokenfactory-issuer", version = "2.5.1", default-features = false } +cw-tokenfactory-types = { path = "./packages/cw-tokenfactory-types", version = "2.5.1", default-features = false } +cw-vesting = { path = "./contracts/external/cw-vesting", version = "2.5.1" } +cw-wormhole = { path = "./packages/cw-wormhole", version = "2.5.1" } +cw20-stake = { path = "./contracts/staking/cw20-stake", version = "2.5.1" } +cw20-stake-external-rewards = { path = "./contracts/staking/cw20-stake-external-rewards", version = "2.5.1" } +cw20-stake-reward-distributor = { path = "./contracts/staking/cw20-stake-reward-distributor", version = "2.5.1" } +cw721-controllers = { path = "./packages/cw721-controllers", version = "2.5.1" } +cw721-roles = { path = "./contracts/external/cw721-roles", version = "2.5.1" } +dao-cw721-extensions = { path = "./packages/dao-cw721-extensions", version = "2.5.1" } +dao-dao-core = { path = "./contracts/dao-dao-core", version = "2.5.1" } +dao-dao-macros = { path = "./packages/dao-dao-macros", version = "2.5.1" } +dao-hooks = { path = "./packages/dao-hooks", version = "2.5.1" } +dao-interface = { path = "./packages/dao-interface", version = "2.5.1" } +dao-migrator = { path = "./contracts/external/dao-migrator", version = "2.5.1" } +dao-pre-propose-approval-single = { path = "./contracts/pre-propose/dao-pre-propose-approval-single", version = "2.5.1" } +dao-pre-propose-approver = { path = "./contracts/pre-propose/dao-pre-propose-approver", version = "2.5.1" } +dao-pre-propose-base = { path = "./packages/dao-pre-propose-base", version = "2.5.1" } +dao-pre-propose-multiple = { path = "./contracts/pre-propose/dao-pre-propose-multiple", version = "2.5.1" } +dao-pre-propose-single = { path = "./contracts/pre-propose/dao-pre-propose-single", version = "2.5.1" } +dao-proposal-condorcet = { path = "./contracts/proposal/dao-proposal-condorcet", version = "2.5.1" } +dao-proposal-hook-counter = { path = "./contracts/test/dao-proposal-hook-counter", version = "2.5.1" } +dao-proposal-multiple = { path = "./contracts/proposal/dao-proposal-multiple", version = "2.5.1" } +dao-proposal-single = { path = "./contracts/proposal/dao-proposal-single", version = "2.5.1" } +dao-proposal-sudo = { path = "./contracts/test/dao-proposal-sudo", version = "2.5.1" } +dao-rewards-distributor = { path = "./contracts/distribution/dao-rewards-distributor", version = "2.5.1" } +dao-test-custom-factory = { path = "./contracts/test/dao-test-custom-factory", version = "2.5.1" } +dao-testing = { path = "./packages/dao-testing", version = "2.5.1" } +dao-voting = { path = "./packages/dao-voting", version = "2.5.1" } +dao-voting-cw20-balance = { path = "./contracts/test/dao-voting-cw20-balance", version = "2.5.1" } +dao-voting-cw20-staked = { path = "./contracts/voting/dao-voting-cw20-staked", version = "2.5.1" } +dao-voting-cw4 = { path = "./contracts/voting/dao-voting-cw4", version = "2.5.1" } +dao-voting-cw721-roles = { path = "./contracts/voting/dao-voting-cw721-roles", version = "2.5.1" } +dao-voting-cw721-staked = { path = "./contracts/voting/dao-voting-cw721-staked", version = "2.5.1" } +dao-voting-onft-staked = { path = "./contracts/voting/dao-voting-onft-staked", version = "2.5.1" } +dao-voting-token-staked = { path = "./contracts/voting/dao-voting-token-staked", version = "2.5.1" } # v1 dependencies. used for state migrations. cw-core-v1 = { package = "cw-core", version = "0.1.0" } diff --git a/contracts/dao-dao-core/schema/dao-dao-core.json b/contracts/dao-dao-core/schema/dao-dao-core.json index 7bf2418c2..7ca1635ea 100644 --- a/contracts/dao-dao-core/schema/dao-dao-core.json +++ b/contracts/dao-dao-core/schema/dao-dao-core.json @@ -1,6 +1,6 @@ { "contract_name": "dao-dao-core", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/distribution/cw-fund-distributor/schema/cw-fund-distributor.json b/contracts/distribution/cw-fund-distributor/schema/cw-fund-distributor.json index 63fc4b821..8c7e8ac22 100644 --- a/contracts/distribution/cw-fund-distributor/schema/cw-fund-distributor.json +++ b/contracts/distribution/cw-fund-distributor/schema/cw-fund-distributor.json @@ -1,6 +1,6 @@ { "contract_name": "cw-fund-distributor", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/distribution/dao-rewards-distributor/schema/dao-rewards-distributor.json b/contracts/distribution/dao-rewards-distributor/schema/dao-rewards-distributor.json index 50f8f7449..93f017585 100644 --- a/contracts/distribution/dao-rewards-distributor/schema/dao-rewards-distributor.json +++ b/contracts/distribution/dao-rewards-distributor/schema/dao-rewards-distributor.json @@ -1,6 +1,6 @@ { "contract_name": "dao-rewards-distributor", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", @@ -225,6 +225,28 @@ }, "additionalProperties": false }, + { + "description": "forcibly withdraw funds from the contract. this is unsafe and should only be used to recover funds that are stuck in the contract.", + "type": "object", + "required": [ + "unsafe_force_withdraw" + ], + "properties": { + "unsafe_force_withdraw": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Coin" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "description": "Update the contract's ownership. The `action` to be provided can be either to propose transferring ownership to an account, accept a pending ownership transfer, or renounce the ownership permanently.", "type": "object", @@ -299,6 +321,21 @@ "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", "type": "string" }, + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, "CreateMsg": { "type": "object", "required": [ diff --git a/contracts/distribution/dao-rewards-distributor/src/contract.rs b/contracts/distribution/dao-rewards-distributor/src/contract.rs index c9d295518..cac92a0db 100644 --- a/contracts/distribution/dao-rewards-distributor/src/contract.rs +++ b/contracts/distribution/dao-rewards-distributor/src/contract.rs @@ -1,8 +1,8 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - ensure, from_json, to_json_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Order, - Response, StdError, StdResult, Uint128, Uint256, + ensure, from_json, to_json_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, DepsMut, Env, + MessageInfo, Order, Response, StdError, StdResult, Uint128, Uint256, }; use cw2::{get_contract_version, set_contract_version}; use cw20::{Cw20ReceiveMsg, Denom}; @@ -91,6 +91,9 @@ pub fn execute( ExecuteMsg::FundLatest {} => execute_fund_latest_native(deps, env, info), ExecuteMsg::Claim { id } => execute_claim(deps, env, info, id), ExecuteMsg::Withdraw { id } => execute_withdraw(deps, info, env, id), + ExecuteMsg::UnsafeForceWithdraw { amount } => { + execute_unsafe_force_withdraw(deps, info, amount) + } } } @@ -594,6 +597,27 @@ fn execute_update_owner( Ok(Response::new().add_attributes(ownership.into_attributes())) } +fn execute_unsafe_force_withdraw( + deps: DepsMut, + info: MessageInfo, + amount: Coin, +) -> Result { + nonpayable(&info)?; + + // only the owner can initiate a force withdraw + cw_ownable::assert_owner(deps.storage, &info.sender)?; + + let send = CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: vec![amount.clone()], + }); + + Ok(Response::new() + .add_message(send) + .add_attribute("action", "unsafe_force_withdraw") + .add_attribute("amount", amount.to_string())) +} + #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { @@ -737,7 +761,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result bool; - /// Perform checked integer division between two durations, erroring if the - /// units do not match or denominator is 0. - fn checked_div(&self, denominator: &Self) -> Result; + /// Returns the ratio between the two durations (numerator / denominator) as + /// a Decimal, erroring if the units do not match. + fn ratio(&self, denominator: &Self) -> Result; } impl DurationExt for Duration { @@ -130,13 +130,13 @@ impl DurationExt for Duration { } } - fn checked_div(&self, denominator: &Self) -> Result { + fn ratio(&self, denominator: &Self) -> Result { match (self, denominator) { (Duration::Height(numerator), Duration::Height(denominator)) => { - Ok(Uint128::from(*numerator).checked_div(Uint128::from(*denominator))?) + Ok(Decimal::checked_from_ratio(*numerator, *denominator)?) } (Duration::Time(numerator), Duration::Time(denominator)) => { - Ok(Uint128::from(*numerator).checked_div(Uint128::from(*denominator))?) + Ok(Decimal::checked_from_ratio(*numerator, *denominator)?) } _ => Err(ContractError::Std(StdError::generic_err(format!( "incompatible durations: got numerator {:?} and denominator {:?}", diff --git a/contracts/distribution/dao-rewards-distributor/src/msg.rs b/contracts/distribution/dao-rewards-distributor/src/msg.rs index ec805c785..63db33247 100644 --- a/contracts/distribution/dao-rewards-distributor/src/msg.rs +++ b/contracts/distribution/dao-rewards-distributor/src/msg.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::Uint128; +use cosmwasm_std::{Coin, Uint128}; use cw20::{Cw20ReceiveMsg, Denom, UncheckedDenom}; use cw4::MemberChangedHookMsg; use cw_ownable::cw_ownable_execute; @@ -60,6 +60,9 @@ pub enum ExecuteMsg { /// claim whatever they earned until this point. this is effectively an /// inverse to fund and does not affect any already-distributed rewards. Withdraw { id: u64 }, + /// forcibly withdraw funds from the contract. this is unsafe and should + /// only be used to recover funds that are stuck in the contract. + UnsafeForceWithdraw { amount: Coin }, } #[cw_serde] diff --git a/contracts/distribution/dao-rewards-distributor/src/rewards.rs b/contracts/distribution/dao-rewards-distributor/src/rewards.rs index da231cec0..3bc6e8c44 100644 --- a/contracts/distribution/dao-rewards-distributor/src/rewards.rs +++ b/contracts/distribution/dao-rewards-distributor/src/rewards.rs @@ -121,17 +121,13 @@ pub fn get_active_total_earned_puvp( if total_power.is_zero() { Ok(curr) } else { - // count intervals of the rewards emission that have passed - // since the last update which need to be distributed + // count (partial) intervals of the rewards emission that have + // passed since the last update which need to be distributed let complete_distribution_periods = - new_reward_distribution_duration.checked_div(&duration)?; - - // It is impossible for this to overflow as total rewards can - // never exceed max value of Uint128 as total tokens in - // existence cannot exceed Uint128 (because the bank module Coin - // type uses Uint128). - let new_rewards_distributed = amount - .full_mul(complete_distribution_periods) + new_reward_distribution_duration.ratio(&duration)?; + + let new_rewards_distributed = Uint256::from(amount) + .checked_mul_floor(complete_distribution_periods)? .checked_mul(scale_factor())?; // the new rewards per unit voting power that have been diff --git a/contracts/distribution/dao-rewards-distributor/src/state.rs b/contracts/distribution/dao-rewards-distributor/src/state.rs index 9095e915e..8ee9a6031 100644 --- a/contracts/distribution/dao-rewards-distributor/src/state.rs +++ b/contracts/distribution/dao-rewards-distributor/src/state.rs @@ -246,9 +246,9 @@ impl DistributionState { // count total intervals of the rewards emission that will pass // based on the start and end times. - let complete_distribution_periods = epoch_duration.checked_div(&duration)?; + let complete_distribution_periods = epoch_duration.ratio(&duration)?; - Ok(amount.checked_mul(complete_distribution_periods)?) + Ok(amount.checked_mul_floor(complete_distribution_periods)?) } } } diff --git a/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs b/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs index 749e1cd38..a94254692 100644 --- a/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs +++ b/contracts/distribution/dao-rewards-distributor/src/testing/suite.rs @@ -974,4 +974,32 @@ impl Suite { ) .unwrap(); } + + pub fn unsafe_force_withdraw(&mut self, amount: Coin) { + let msg = ExecuteMsg::UnsafeForceWithdraw { amount }; + self.base + .app + .execute_contract( + Addr::unchecked(OWNER), + self.distribution_contract.clone(), + &msg, + &[], + ) + .unwrap(); + } + + pub fn unsafe_force_withdraw_unauthorized(&mut self, amount: Coin) -> ContractError { + let msg = ExecuteMsg::UnsafeForceWithdraw { amount }; + self.base + .app + .execute_contract( + Addr::unchecked("no_one"), + self.distribution_contract.clone(), + &msg, + &[], + ) + .unwrap_err() + .downcast() + .unwrap() + } } diff --git a/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs b/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs index b40752e97..5c3d9f718 100644 --- a/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs +++ b/contracts/distribution/dao-rewards-distributor/src/testing/tests.rs @@ -2659,6 +2659,86 @@ fn test_large_stake_before_claim() { suite.claim_rewards(MEMBER3, 1); } +#[test] +fn test_stake_during_interval() { + let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) + .with_rewards_config(RewardsConfig { + amount: 100, + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), + duration: Duration::Height(100), + destination: None, + continuous: true, + }) + .build(); + + suite.assert_amount(100); + suite.assert_ends_at(Expiration::AtHeight(100_000_000)); + suite.assert_duration(100); + + // after half the duration, half the rewards (50) should be distributed. + suite.skip_blocks(50); + + // MEMBER1 has 50% voting power, so should receive 50% of the rewards. + suite.assert_pending_rewards(MEMBER1, 1, 25); + + // change voting power before the next distribution interval. MEMBER1 now + // has 80% voting power, an increase from 50%. + suite.mint_native(coin(300, GOV_DENOM), MEMBER1); + suite.stake_native_tokens(MEMBER1, 300); + + // after the rest of the initial duration, they should earn rewards at the + // increased rate (50 more tokens, and they own 80% of them). 25 + 40 = 65 + suite.skip_blocks(50); + suite.assert_pending_rewards(MEMBER1, 1, 65); + + // after 50 more blocks from VP change, there are 40 more rewards. + suite.skip_blocks(50); + suite.assert_pending_rewards(MEMBER1, 1, 105); +} + +#[test] +fn test_stake_on_edges_of_interval() { + let mut suite = SuiteBuilder::base(super::suite::DaoType::Native) + .with_rewards_config(RewardsConfig { + amount: 100, + denom: UncheckedDenom::Native(GOV_DENOM.to_string()), + duration: Duration::Height(100), + destination: None, + continuous: true, + }) + .build(); + + suite.assert_amount(100); + suite.assert_ends_at(Expiration::AtHeight(100_000_000)); + suite.assert_duration(100); + + // after half the duration, half the rewards (50) should be distributed. + suite.skip_blocks(50); + + // MEMBER1 has 50% voting power, so should receive 50% of the rewards. + suite.assert_pending_rewards(MEMBER1, 1, 25); + + // after the full duration, all the rewards (50) should be distributed. + suite.skip_blocks(50); + + // MEMBER1 has 50% voting power, so should receive 50% of the rewards. + suite.assert_pending_rewards(MEMBER1, 1, 50); + + // change voting power right at the end of the distribution interval. + // MEMBER1 now has 80% voting power, an increase from 50%. + suite.mint_native(coin(300, GOV_DENOM), MEMBER1); + suite.stake_native_tokens(MEMBER1, 300); + + // after another interval, they should earn rewards at the increased rate + // (50 more tokens, and they own 80% of them). 50 + 40 = 90 + suite.skip_blocks(50); + suite.assert_pending_rewards(MEMBER1, 1, 90); + + // after 50 more blocks from VP change, there are 40 more rewards. + suite.skip_blocks(50); + suite.assert_pending_rewards(MEMBER1, 1, 130); +} + #[test] fn test_fund_latest_native() { let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); @@ -2865,12 +2945,11 @@ fn test_queries_before_funded() { } #[test] -fn test_migrate() { +fn test_migrate_validation() { let mut deps = mock_dependencies(); - cw2::set_contract_version(&mut deps.storage, "test", "0.0.1").unwrap(); - // wrong contract name errors + cw2::set_contract_version(&mut deps.storage, "test", "0.0.1").unwrap(); let err: crate::ContractError = crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( @@ -2881,16 +2960,13 @@ fn test_migrate() { } ); - // migration succeeds from past version of same contract - cw2::set_contract_version(&mut deps.storage, CONTRACT_NAME, "0.0.1").unwrap(); - crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap(); - // same-version migration errors + cw2::set_contract_version(&mut deps.storage, CONTRACT_NAME, CONTRACT_VERSION).unwrap(); let err: crate::ContractError = crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( err, - crate::ContractError::MigrationErrorInvalidVersion { + crate::ContractError::MigrationErrorInvalidVersionNotNewer { new: CONTRACT_VERSION.to_string(), current: CONTRACT_VERSION.to_string(), } @@ -2902,9 +2978,40 @@ fn test_migrate() { crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap_err(); assert_eq!( err, - crate::ContractError::MigrationErrorInvalidVersion { + crate::ContractError::MigrationErrorInvalidVersionNotNewer { new: CONTRACT_VERSION.to_string(), current: "9.9.9".to_string(), } ); + + // migration succeeds from v2.4.0 + cw2::set_contract_version(&mut deps.storage, CONTRACT_NAME, "2.4.0").unwrap(); + crate::contract::migrate(deps.as_mut(), mock_env(), MigrateMsg {}).unwrap(); +} + +#[test] +fn test_unsafe_force_withdraw() { + let mut suite = SuiteBuilder::base(super::suite::DaoType::Native).build(); + + let before_balance = + suite.get_balance_native(suite.distribution_contract.clone(), &suite.reward_denom); + + // non-owner cannot force withdraw + let err = suite.unsafe_force_withdraw_unauthorized(coin(100, &suite.reward_denom)); + assert_eq!(err, ContractError::Ownable(OwnershipError::NotOwner)); + + let after_balance = + suite.get_balance_native(suite.distribution_contract.clone(), &suite.reward_denom); + assert_eq!(after_balance, before_balance); + + // owner has no balance + let owner_balance = suite.get_balance_native(OWNER, &suite.reward_denom); + assert_eq!(owner_balance, 0); + + // owner can force withdraw + suite.unsafe_force_withdraw(coin(100, &suite.reward_denom)); + + // owner has balance + let owner_balance = suite.get_balance_native(OWNER, &suite.reward_denom); + assert_eq!(owner_balance, 100); } diff --git a/contracts/external/btsg-ft-factory/schema/btsg-ft-factory.json b/contracts/external/btsg-ft-factory/schema/btsg-ft-factory.json index 66c4d8f67..784d1ca5a 100644 --- a/contracts/external/btsg-ft-factory/schema/btsg-ft-factory.json +++ b/contracts/external/btsg-ft-factory/schema/btsg-ft-factory.json @@ -1,6 +1,6 @@ { "contract_name": "btsg-ft-factory", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw-admin-factory/schema/cw-admin-factory.json b/contracts/external/cw-admin-factory/schema/cw-admin-factory.json index d6f3ebcd9..743c9ceed 100644 --- a/contracts/external/cw-admin-factory/schema/cw-admin-factory.json +++ b/contracts/external/cw-admin-factory/schema/cw-admin-factory.json @@ -1,6 +1,6 @@ { "contract_name": "cw-admin-factory", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw-payroll-factory/schema/cw-payroll-factory.json b/contracts/external/cw-payroll-factory/schema/cw-payroll-factory.json index d9eb0eb32..1544e81a9 100644 --- a/contracts/external/cw-payroll-factory/schema/cw-payroll-factory.json +++ b/contracts/external/cw-payroll-factory/schema/cw-payroll-factory.json @@ -1,6 +1,6 @@ { "contract_name": "cw-payroll-factory", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw-token-swap/schema/cw-token-swap.json b/contracts/external/cw-token-swap/schema/cw-token-swap.json index 0875c942f..66b147cd2 100644 --- a/contracts/external/cw-token-swap/schema/cw-token-swap.json +++ b/contracts/external/cw-token-swap/schema/cw-token-swap.json @@ -1,6 +1,6 @@ { "contract_name": "cw-token-swap", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json b/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json index 6b5e40a2a..a7bed322d 100644 --- a/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json +++ b/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json @@ -1,6 +1,6 @@ { "contract_name": "cw-tokenfactory-issuer", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw-vesting/schema/cw-vesting.json b/contracts/external/cw-vesting/schema/cw-vesting.json index d26c50748..6a3fd952d 100644 --- a/contracts/external/cw-vesting/schema/cw-vesting.json +++ b/contracts/external/cw-vesting/schema/cw-vesting.json @@ -1,6 +1,6 @@ { "contract_name": "cw-vesting", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/cw721-roles/schema/cw721-roles.json b/contracts/external/cw721-roles/schema/cw721-roles.json index d9a254380..18e12c74b 100644 --- a/contracts/external/cw721-roles/schema/cw721-roles.json +++ b/contracts/external/cw721-roles/schema/cw721-roles.json @@ -1,6 +1,6 @@ { "contract_name": "cw721-roles", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/external/dao-migrator/schema/dao-migrator.json b/contracts/external/dao-migrator/schema/dao-migrator.json index 62f9371fc..954647379 100644 --- a/contracts/external/dao-migrator/schema/dao-migrator.json +++ b/contracts/external/dao-migrator/schema/dao-migrator.json @@ -1,6 +1,6 @@ { "contract_name": "dao-migrator", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json b/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json index 25303c6bd..2c30b26e8 100644 --- a/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json +++ b/contracts/pre-propose/dao-pre-propose-approval-single/schema/dao-pre-propose-approval-single.json @@ -1,6 +1,6 @@ { "contract_name": "dao-pre-propose-approval-single", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/pre-propose/dao-pre-propose-approver/schema/dao-pre-propose-approver.json b/contracts/pre-propose/dao-pre-propose-approver/schema/dao-pre-propose-approver.json index 8dc9a227c..1168bb676 100644 --- a/contracts/pre-propose/dao-pre-propose-approver/schema/dao-pre-propose-approver.json +++ b/contracts/pre-propose/dao-pre-propose-approver/schema/dao-pre-propose-approver.json @@ -1,6 +1,6 @@ { "contract_name": "dao-pre-propose-approver", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json b/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json index a23f2cc06..9d2b4a9b5 100644 --- a/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json +++ b/contracts/pre-propose/dao-pre-propose-multiple/schema/dao-pre-propose-multiple.json @@ -1,6 +1,6 @@ { "contract_name": "dao-pre-propose-multiple", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json b/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json index d91d61190..ca2a8348c 100644 --- a/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json +++ b/contracts/pre-propose/dao-pre-propose-single/schema/dao-pre-propose-single.json @@ -1,6 +1,6 @@ { "contract_name": "dao-pre-propose-single", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json b/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json index 31094252c..49c48e13b 100644 --- a/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json +++ b/contracts/proposal/dao-proposal-condorcet/schema/dao-proposal-condorcet.json @@ -1,6 +1,6 @@ { "contract_name": "dao-proposal-condorcet", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json b/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json index 75729fda4..0921abb8a 100644 --- a/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json +++ b/contracts/proposal/dao-proposal-multiple/schema/dao-proposal-multiple.json @@ -1,6 +1,6 @@ { "contract_name": "dao-proposal-multiple", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json b/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json index 9738cadec..cd90bc875 100644 --- a/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json +++ b/contracts/proposal/dao-proposal-single/schema/dao-proposal-single.json @@ -1,6 +1,6 @@ { "contract_name": "dao-proposal-single", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/staking/cw20-stake-external-rewards/schema/cw20-stake-external-rewards.json b/contracts/staking/cw20-stake-external-rewards/schema/cw20-stake-external-rewards.json index aeec250c4..9bb4e69d7 100644 --- a/contracts/staking/cw20-stake-external-rewards/schema/cw20-stake-external-rewards.json +++ b/contracts/staking/cw20-stake-external-rewards/schema/cw20-stake-external-rewards.json @@ -1,6 +1,6 @@ { "contract_name": "cw20-stake-external-rewards", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/staking/cw20-stake-reward-distributor/schema/cw20-stake-reward-distributor.json b/contracts/staking/cw20-stake-reward-distributor/schema/cw20-stake-reward-distributor.json index 3acae01e3..d1328d9d4 100644 --- a/contracts/staking/cw20-stake-reward-distributor/schema/cw20-stake-reward-distributor.json +++ b/contracts/staking/cw20-stake-reward-distributor/schema/cw20-stake-reward-distributor.json @@ -1,6 +1,6 @@ { "contract_name": "cw20-stake-reward-distributor", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/staking/cw20-stake/schema/cw20-stake.json b/contracts/staking/cw20-stake/schema/cw20-stake.json index 77c19cd17..8716e1d57 100644 --- a/contracts/staking/cw20-stake/schema/cw20-stake.json +++ b/contracts/staking/cw20-stake/schema/cw20-stake.json @@ -1,6 +1,6 @@ { "contract_name": "cw20-stake", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-cw20-staked/schema/dao-voting-cw20-staked.json b/contracts/voting/dao-voting-cw20-staked/schema/dao-voting-cw20-staked.json index 17afb6f5c..ce7327e21 100644 --- a/contracts/voting/dao-voting-cw20-staked/schema/dao-voting-cw20-staked.json +++ b/contracts/voting/dao-voting-cw20-staked/schema/dao-voting-cw20-staked.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-cw20-staked", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-cw4/schema/dao-voting-cw4.json b/contracts/voting/dao-voting-cw4/schema/dao-voting-cw4.json index d8908601f..cee956c6e 100644 --- a/contracts/voting/dao-voting-cw4/schema/dao-voting-cw4.json +++ b/contracts/voting/dao-voting-cw4/schema/dao-voting-cw4.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-cw4", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-cw721-roles/schema/dao-voting-cw721-roles.json b/contracts/voting/dao-voting-cw721-roles/schema/dao-voting-cw721-roles.json index 71f8d7c38..e804bb47a 100644 --- a/contracts/voting/dao-voting-cw721-roles/schema/dao-voting-cw721-roles.json +++ b/contracts/voting/dao-voting-cw721-roles/schema/dao-voting-cw721-roles.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-cw721-roles", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-cw721-staked/schema/dao-voting-cw721-staked.json b/contracts/voting/dao-voting-cw721-staked/schema/dao-voting-cw721-staked.json index aae82a3f8..346476689 100644 --- a/contracts/voting/dao-voting-cw721-staked/schema/dao-voting-cw721-staked.json +++ b/contracts/voting/dao-voting-cw721-staked/schema/dao-voting-cw721-staked.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-cw721-staked", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-onft-staked/schema/dao-voting-onft-staked.json b/contracts/voting/dao-voting-onft-staked/schema/dao-voting-onft-staked.json index 07d68128f..ede91d3be 100644 --- a/contracts/voting/dao-voting-onft-staked/schema/dao-voting-onft-staked.json +++ b/contracts/voting/dao-voting-onft-staked/schema/dao-voting-onft-staked.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-onft-staked", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", diff --git a/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json b/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json index 8f6c9aaba..68d20647d 100644 --- a/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json +++ b/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json @@ -1,6 +1,6 @@ { "contract_name": "dao-voting-token-staked", - "contract_version": "2.5.0", + "contract_version": "2.5.1", "idl_version": "1.0.0", "instantiate": { "$schema": "http://json-schema.org/draft-07/schema#", From 1964fd3816d496859f76e082c2eebb759241a3dd Mon Sep 17 00:00:00 2001 From: Gabe Lopez Date: Wed, 30 Oct 2024 23:32:19 -0500 Subject: [PATCH 50/50] cw-orch improvements (#880) * Added cw_orch fn_name for proposal executes follows the same naming as `dao_proposal_sudo` execute * Update osmosis-test-tube to match cw-orch * just gen-schema --- Cargo.lock | 599 +++++++++++++----- Cargo.toml | 14 +- .../schema/cw-tokenfactory-issuer.json | 14 +- .../tests/cases/burn.rs | 2 +- .../tests/cases/denom_metadata.rs | 6 + .../cw-tokenfactory-issuer/tests/test_env.rs | 2 +- .../dao-proposal-condorcet/src/msg.rs | 18 +- .../proposal/dao-proposal-multiple/src/msg.rs | 1 + .../proposal/dao-proposal-single/src/msg.rs | 1 + .../src/testing/integration_tests.rs | 2 +- .../schema/dao-voting-token-staked.json | 2 +- .../dao-voting-token-staked/src/contract.rs | 5 +- .../src/tests/test_tube/test_env.rs | 4 +- packages/cw-orch/src/tests.rs | 17 +- packages/cw-tokenfactory-types/src/msg.rs | 2 + packages/dao-testing/src/lib.rs | 4 + .../dao-testing/src/test_tube/cw4_group.rs | 2 +- .../dao-testing/src/test_tube/cw721_base.rs | 2 +- .../src/test_tube/cw_admin_factory.rs | 2 +- .../src/test_tube/cw_tokenfactory_issuer.rs | 2 +- .../dao-testing/src/test_tube/dao_dao_core.rs | 2 +- .../src/test_tube/dao_proposal_single.rs | 2 +- .../src/test_tube/dao_test_custom_factory.rs | 2 +- .../src/test_tube/dao_voting_cw4.rs | 2 +- packages/dao-testing/src/test_tube/mod.rs | 23 +- 25 files changed, 533 insertions(+), 199 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16b2a50ff..cb9c463df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -459,17 +459,17 @@ checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bindgen" -version = "0.68.1" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", + "itertools 0.12.1", "lazy_static", "lazycell", "log", - "peeking_take_while", "prettyplease", "proc-macro2", "quote", @@ -486,7 +486,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" dependencies = [ - "bs58", + "bs58 0.4.0", "hmac", "k256 0.11.6", "once_cell", @@ -498,6 +498,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58 0.5.1", + "hmac", + "k256 0.13.3", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -567,6 +583,15 @@ dependencies = [ "sha2 0.9.9", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", +] + [[package]] name = "btsg-ft-factory" version = "2.5.1" @@ -741,17 +766,6 @@ dependencies = [ "tonic 0.8.3", ] -[[package]] -name = "cosmos-sdk-proto" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" -dependencies = [ - "prost 0.11.9", - "prost-types 0.11.9", - "tendermint-proto 0.23.9", -] - [[package]] name = "cosmos-sdk-proto" version = "0.15.0" @@ -776,6 +790,17 @@ dependencies = [ "tonic 0.9.2", ] +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +dependencies = [ + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", +] + [[package]] name = "cosmos-sdk-proto" version = "0.21.1" @@ -789,12 +814,12 @@ dependencies = [ [[package]] name = "cosmrs" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" +checksum = "6fa07096219b1817432b8f1e47c22e928c64bbfd231fc08f0a98f0e7ddd602b7" dependencies = [ - "bip32", - "cosmos-sdk-proto 0.14.0", + "bip32 0.4.0", + "cosmos-sdk-proto 0.15.0", "ecdsa 0.14.8", "eyre", "getrandom", @@ -803,29 +828,29 @@ dependencies = [ "serde", "serde_json", "subtle-encoding", - "tendermint 0.23.9", - "tendermint-rpc 0.23.9", + "tendermint 0.26.0", + "tendermint-rpc 0.26.0", "thiserror", ] [[package]] name = "cosmrs" -version = "0.10.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa07096219b1817432b8f1e47c22e928c64bbfd231fc08f0a98f0e7ddd602b7" +checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ - "bip32", - "cosmos-sdk-proto 0.15.0", - "ecdsa 0.14.8", + "bip32 0.5.2", + "cosmos-sdk-proto 0.20.0", + "ecdsa 0.16.9", "eyre", - "getrandom", - "k256 0.11.6", + "k256 0.13.3", "rand_core 0.6.4", "serde", "serde_json", + "signature 2.2.0", "subtle-encoding", - "tendermint 0.26.0", - "tendermint-rpc 0.26.0", + "tendermint 0.34.1", + "tendermint-rpc 0.34.1", "thiserror", ] @@ -956,7 +981,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" dependencies = [ - "sct", + "sct 0.6.1", ] [[package]] @@ -972,6 +997,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "cw-address-like" version = "1.0.4" @@ -1544,7 +1582,7 @@ dependencies = [ "cw-tokenfactory-types", "cw2 1.1.2", "dao-interface 2.5.1", - "osmosis-std", + "osmosis-std 0.25.0", "osmosis-test-tube", "prost 0.12.3", "prost-derive 0.12.3", @@ -1561,7 +1599,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "dao-interface 2.5.1", - "osmosis-std", + "osmosis-std 0.25.0", "osmosis-std-derive", "prost 0.12.3", "prost-derive 0.12.3", @@ -2295,7 +2333,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw721 0.18.0", - "osmosis-std", + "osmosis-std 0.20.1", ] [[package]] @@ -2309,7 +2347,7 @@ dependencies = [ "cw2 1.1.2", "cw20 1.1.2", "cw721 0.18.0", - "osmosis-std", + "osmosis-std 0.25.0", ] [[package]] @@ -2860,7 +2898,7 @@ dependencies = [ "dao-voting-cw721-staked", "dao-voting-onft-staked", "dao-voting-token-staked", - "osmosis-std", + "osmosis-std 0.25.0", "osmosis-test-tube", "rand", "serde", @@ -3042,7 +3080,7 @@ dependencies = [ "dao-test-custom-factory", "dao-testing", "dao-voting 2.5.1", - "osmosis-std", + "osmosis-std 0.25.0", "osmosis-test-tube", "serde", "thiserror", @@ -3102,7 +3140,7 @@ dependencies = [ "dao-test-custom-factory", "dao-testing", "dao-voting 2.5.1", - "osmosis-std", + "osmosis-std 0.25.0", "osmosis-test-tube", "serde", "thiserror", @@ -3228,6 +3266,29 @@ dependencies = [ "signature 1.6.4", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "1.0.1" @@ -3235,7 +3296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ "curve25519-dalek", - "ed25519", + "ed25519 1.5.3", "sha2 0.9.9", "zeroize", ] @@ -3300,6 +3361,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -3715,10 +3785,10 @@ dependencies = [ "headers", "http", "hyper", - "hyper-rustls", - "rustls-native-certs", + "hyper-rustls 0.22.1", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "tower-service", "webpki", ] @@ -3733,14 +3803,28 @@ dependencies = [ "futures-util", "hyper", "log", - "rustls", - "rustls-native-certs", + "rustls 0.19.1", + "rustls-native-certs 0.5.0", "tokio", - "tokio-rustls", + "tokio-rustls 0.22.0", "webpki", "webpki-roots", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -3837,6 +3921,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "ipnet" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" + [[package]] name = "is-terminal" version = "0.4.13" @@ -4028,13 +4118,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4078,16 +4169,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - [[package]] name = "num_threads" version = "0.1.7" @@ -4185,6 +4266,22 @@ dependencies = [ "serde-cw-value", ] +[[package]] +name = "osmosis-std" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca66dca7e8c9b11b995cd41a44c038134ccca4469894d663d8a9452d6e716241" +dependencies = [ + "chrono", + "cosmwasm-std", + "osmosis-std-derive", + "prost 0.12.3", + "prost-types 0.12.3", + "schemars", + "serde", + "serde-cw-value", +] + [[package]] name = "osmosis-std-derive" version = "0.20.1" @@ -4200,16 +4297,16 @@ dependencies = [ [[package]] name = "osmosis-test-tube" -version = "20.1.2" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1534a419d9e2c27b0b4869e68496b92abca93464b82efbdd1f1b43467f2938" +checksum = "5eb35dcc9adc1b39e23dfae07c9f04a60187fde57a52b7762434ea6548581a1a" dependencies = [ "base64 0.21.7", "bindgen", - "cosmrs 0.9.0", + "cosmrs 0.15.0", "cosmwasm-std", - "osmosis-std", - "prost 0.11.9", + "osmosis-std 0.25.0", + "prost 0.12.3", "serde", "serde_json", "test-tube", @@ -4238,19 +4335,23 @@ dependencies = [ ] [[package]] -name = "peeking_take_while" -version = "0.1.2" +name = "peg" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +dependencies = [ + "peg-macros 0.7.0", + "peg-runtime 0.7.0", +] [[package]] name = "peg" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" dependencies = [ - "peg-macros", - "peg-runtime", + "peg-macros 0.8.4", + "peg-runtime 0.8.3", ] [[package]] @@ -4259,7 +4360,18 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" dependencies = [ - "peg-runtime", + "peg-runtime 0.7.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime 0.8.3", "proc-macro2", "quote", ] @@ -4270,6 +4382,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4562,6 +4680,47 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -4592,12 +4751,27 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "ripemd" version = "0.1.3" @@ -4672,11 +4846,23 @@ checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ "base64 0.13.1", "log", - "ring", - "sct", + "ring 0.16.20", + "sct 0.6.1", "webpki", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct 0.7.1", +] + [[package]] name = "rustls-native-certs" version = "0.5.0" @@ -4684,11 +4870,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" dependencies = [ "openssl-probe", - "rustls", + "rustls 0.19.1", "schannel", "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -4749,8 +4966,18 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] @@ -4891,6 +5118,18 @@ dependencies = [ "syn 2.0.74", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -5000,6 +5239,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.6.0" @@ -5099,6 +5344,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -5127,15 +5378,36 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tendermint" -version = "0.23.9" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467f82178deeebcd357e1273a0c0b77b9a8a0313ef7c07074baebe99d87851f4" +checksum = "baa1d2d0ec1b531ba7d196f0dbee5e78ed2a82bfba928e88dff64aeec0b26073" dependencies = [ "async-trait", "bytes", - "ed25519", + "ed25519 1.5.3", "ed25519-dalek", "flex-error", "futures", @@ -5153,75 +5425,75 @@ dependencies = [ "signature 1.6.4", "subtle", "subtle-encoding", - "tendermint-proto 0.23.9", + "tendermint-proto 0.26.0", "time", "zeroize", ] [[package]] name = "tendermint" -version = "0.26.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa1d2d0ec1b531ba7d196f0dbee5e78ed2a82bfba928e88dff64aeec0b26073" +checksum = "15ab8f0a25d0d2ad49ac615da054d6a76aa6603ff95f7d18bafdd34450a1a04b" dependencies = [ - "async-trait", "bytes", - "ed25519", - "ed25519-dalek", + "digest 0.10.7", + "ed25519 2.2.3", + "ed25519-consensus", "flex-error", "futures", - "k256 0.11.6", + "k256 0.13.3", "num-traits", "once_cell", - "prost 0.11.9", - "prost-types 0.11.9", - "ripemd160", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", "serde", "serde_bytes", "serde_json", "serde_repr", - "sha2 0.9.9", - "signature 1.6.4", + "sha2 0.10.8", + "signature 2.2.0", "subtle", "subtle-encoding", - "tendermint-proto 0.26.0", + "tendermint-proto 0.34.1", "time", "zeroize", ] [[package]] name = "tendermint-config" -version = "0.23.9" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42ee0abc27ef5fc34080cce8d43c189950d331631546e7dfb983b6274fa327" +checksum = "202a2f19502c03b353d8157694ed24fbc58c3dd64a92a5b0cb80b79c82af5be4" dependencies = [ "flex-error", "serde", "serde_json", - "tendermint 0.23.9", + "tendermint 0.26.0", "toml", "url", ] [[package]] name = "tendermint-config" -version = "0.26.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202a2f19502c03b353d8157694ed24fbc58c3dd64a92a5b0cb80b79c82af5be4" +checksum = "e1a02da769166e2052cd537b1a97c78017632c2d9e19266367b27e73910434fc" dependencies = [ "flex-error", "serde", "serde_json", - "tendermint 0.26.0", + "tendermint 0.34.1", "toml", "url", ] [[package]] name = "tendermint-proto" -version = "0.23.9" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ce80bf536476db81ecc9ebab834dc329c9c1509a694f211a73858814bfe023" +checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" dependencies = [ "bytes", "flex-error", @@ -5237,9 +5509,9 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.26.0" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974d6330a19dfa6720e9f663fc59101d207a817db3f9c730d3f31caaa565b574" +checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" dependencies = [ "bytes", "flex-error", @@ -5255,16 +5527,16 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.32.2" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ "bytes", "flex-error", "num-derive 0.3.3", "num-traits", - "prost 0.11.9", - "prost-types 0.11.9", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -5291,9 +5563,9 @@ dependencies = [ [[package]] name = "tendermint-rpc" -version = "0.23.9" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f14aafe3528a0f75e9f3f410b525617b2de16c4b7830a21f717eee62882ec60" +checksum = "b5d87fa5429bd2ee39c4809dd546096daf432de9b71157bc12c182ab5bae7ea7" dependencies = [ "async-trait", "bytes", @@ -5303,56 +5575,56 @@ dependencies = [ "http", "hyper", "hyper-proxy", - "hyper-rustls", - "peg", + "hyper-rustls 0.22.1", + "peg 0.7.0", "pin-project", "serde", "serde_bytes", "serde_json", + "subtle", "subtle-encoding", - "tendermint 0.23.9", - "tendermint-config 0.23.9", - "tendermint-proto 0.23.9", + "tendermint 0.26.0", + "tendermint-config 0.26.0", + "tendermint-proto 0.26.0", "thiserror", "time", "tokio", "tracing", "url", - "uuid", + "uuid 0.8.2", "walkdir", ] [[package]] name = "tendermint-rpc" -version = "0.26.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5d87fa5429bd2ee39c4809dd546096daf432de9b71157bc12c182ab5bae7ea7" +checksum = "71afae8bb5f6b14ed48d4e1316a643b6c2c3cbad114f510be77b4ed20b7b3e42" dependencies = [ "async-trait", "bytes", "flex-error", "futures", "getrandom", - "http", - "hyper", - "hyper-proxy", - "hyper-rustls", - "peg", + "peg 0.8.4", "pin-project", + "rand", + "reqwest", + "semver", "serde", "serde_bytes", "serde_json", "subtle", "subtle-encoding", - "tendermint 0.26.0", - "tendermint-config 0.26.0", - "tendermint-proto 0.26.0", + "tendermint 0.34.1", + "tendermint-config 0.34.1", + "tendermint-proto 0.34.1", "thiserror", "time", "tokio", "tracing", "url", - "uuid", + "uuid 1.10.0", "walkdir", ] @@ -5388,15 +5660,15 @@ dependencies = [ [[package]] name = "test-tube" -version = "0.2.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e79c7af10967dd3383ee5aae3810637cc3f2fd040f87f862c02151db060628" +checksum = "804bb9bda992b6cda6f883e7973cb999d4da90d21257fb918d6a693407148681" dependencies = [ - "base64 0.13.1", - "cosmrs 0.9.0", + "base64 0.21.7", + "cosmrs 0.15.0", "cosmwasm-std", - "osmosis-std", - "prost 0.11.9", + "osmosis-std 0.25.0", + "prost 0.12.3", "serde", "serde_json", "thiserror", @@ -5456,19 +5728,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5483,9 +5754,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -5498,11 +5769,21 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "rustls", + "rustls 0.19.1", "tokio", "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -5726,6 +6007,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.2" @@ -5743,6 +6030,12 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + [[package]] name = "version_check" version = "0.9.5" @@ -5812,6 +6105,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.93" @@ -5857,8 +6162,8 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -6061,6 +6366,16 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wynd-utils" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 5e1196bd8..30106727b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,13 +57,13 @@ cw721-base = "0.18" env_logger = "0.10" once_cell = "1.18" omniflix-std = "0.1.8" -osmosis-std = "0.20.1" +osmosis-std = "0.25.0" osmosis-std-derive = "0.20.1" -osmosis-test-tube = "20.1.1" +osmosis-test-tube = "25.0.0" proc-macro2 = "1.0" -prost = { version = "=0.12.3", features = ["prost-derive"] } -prost-types = { version = "=0.12.3", default-features = false } -prost-derive = "=0.12.3" +prost = { version = "0.12.3", features = ["prost-derive"] } +prost-types = { version = "0.12.3", default-features = false } +prost-derive = "0.12.3" quote = "1.0" rand = "0.8" schemars = "0.8" @@ -81,7 +81,7 @@ test-context = "0.1" thiserror = { version = "1.0" } wynd-utils = "0.4" cw-orch = "0.24.1" -tokio = "=1.38.1" +tokio = "1.40.0" # One commit ahead of version 0.3.0. Allows initialization with an # optional owner. @@ -159,4 +159,4 @@ dao-pre-propose-single-v241 = { package = "dao-pre-propose-single", version = "= dao-proposal-multiple-v241 = { package = "dao-proposal-multiple", version = "=2.4.1" } dao-proposal-single-v241 = { package = "dao-proposal-single", version = "=2.4.1" } dao-voting-cw4-v241 = { package = "dao-voting-cw4", version = "=2.4.1" } -dao-voting-v241 = { package = "dao-voting", version = "=2.4.1" } \ No newline at end of file +dao-voting-v241 = { package = "dao-voting", version = "=2.4.1" } diff --git a/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json b/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json index a7bed322d..9afbb967b 100644 --- a/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json +++ b/contracts/external/cw-tokenfactory-issuer/schema/cw-tokenfactory-issuer.json @@ -420,7 +420,7 @@ "type": "string" }, "exponent": { - "description": "exponent represents power of 10 exponent that one must raise the base_denom to in order to equal the given DenomUnit's denom 1 denom = 1^exponent base_denom (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with exponent = 6, thus: 1 atom = 10^6 uatom).", + "description": "exponent represents power of 10 exponent that one must raise the base_denom to in order to equal the given DenomUnit's denom 1 denom = 10^exponent base_denom (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with exponent = 6, thus: 1 atom = 10^6 uatom).", "type": "integer", "format": "uint32", "minimum": 0.0 @@ -483,7 +483,9 @@ "description", "display", "name", - "symbol" + "symbol", + "uri", + "uri_hash" ], "properties": { "base": { @@ -511,6 +513,14 @@ "symbol": { "description": "symbol is the token symbol usually shown on exchanges (eg: ATOM). This can be the same as the display.\n\nSince: cosmos-sdk 0.43", "type": "string" + }, + "uri": { + "description": "URI to a document (on or off-chain) that contains additional information. Optional.\n\nSince: cosmos-sdk 0.46", + "type": "string" + }, + "uri_hash": { + "description": "URIHash is a sha256 hash of a document pointed by URI. It's used to verify that the document didn't change. Optional.\n\nSince: cosmos-sdk 0.46", + "type": "string" } } }, diff --git a/contracts/external/cw-tokenfactory-issuer/tests/cases/burn.rs b/contracts/external/cw-tokenfactory-issuer/tests/cases/burn.rs index 6c63e1e38..08ac2abee 100644 --- a/contracts/external/cw-tokenfactory-issuer/tests/cases/burn.rs +++ b/contracts/external/cw-tokenfactory-issuer/tests/cases/burn.rs @@ -209,7 +209,7 @@ fn burn_more_than_balance_should_fail_and_not_deduct_allowance() { assert_eq!( err, RunnerError::ExecuteError { - msg: format!("failed to execute message; message index: 0: dispatch: submessages: {balance}{denom} is smaller than {burn_amount}{denom}: insufficient funds") + msg: format!("failed to execute message; message index: 0: dispatch: submessages: spendable balance {balance}{denom} is smaller than {burn_amount}{denom}: insufficient funds") } ); diff --git a/contracts/external/cw-tokenfactory-issuer/tests/cases/denom_metadata.rs b/contracts/external/cw-tokenfactory-issuer/tests/cases/denom_metadata.rs index 660f238a3..7c36bfba6 100644 --- a/contracts/external/cw-tokenfactory-issuer/tests/cases/denom_metadata.rs +++ b/contracts/external/cw-tokenfactory-issuer/tests/cases/denom_metadata.rs @@ -30,6 +30,8 @@ fn set_denom_metadata_by_contract_owner_should_work() { display: "sthb".to_string(), name: "Stable Thai Baht".to_string(), symbol: "STHB".to_string(), + uri: String::default(), + uri_hash: String::default(), }; env.cw_tokenfactory_issuer .set_denom_metadata(metadata, owner) @@ -64,6 +66,8 @@ fn set_denom_metadata_by_contract_non_owner_should_fail() { display: "sthb".to_string(), name: "Stable Thai Baht".to_string(), symbol: "STHB".to_string(), + uri: String::default(), + uri_hash: String::default(), }; // Set denom metadata @@ -108,6 +112,8 @@ fn set_denom_metadata_with_base_denom_unit_should_overides_default_base_denom_un display: "sthb".to_string(), name: "Stable Thai Baht".to_string(), symbol: "STHB".to_string(), + uri: String::default(), + uri_hash: String::default(), }; // Set denom metadata diff --git a/contracts/external/cw-tokenfactory-issuer/tests/test_env.rs b/contracts/external/cw-tokenfactory-issuer/tests/test_env.rs index 99e9b92cd..213f1ec76 100644 --- a/contracts/external/cw-tokenfactory-issuer/tests/test_env.rs +++ b/contracts/external/cw-tokenfactory-issuer/tests/test_env.rs @@ -149,7 +149,7 @@ impl TokenfactoryIssuer { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("cw_tokenfactory_issuer"), &[token_creation_fee], signer, )? diff --git a/contracts/proposal/dao-proposal-condorcet/src/msg.rs b/contracts/proposal/dao-proposal-condorcet/src/msg.rs index 684108444..078f85711 100644 --- a/contracts/proposal/dao-proposal-condorcet/src/msg.rs +++ b/contracts/proposal/dao-proposal-condorcet/src/msg.rs @@ -15,10 +15,20 @@ pub struct Choice { #[cw_serde] #[derive(cw_orch::ExecuteFns)] pub enum ExecuteMsg { - Propose { choices: Vec }, - Vote { proposal_id: u32, vote: Vec }, - Execute { proposal_id: u32 }, - Close { proposal_id: u32 }, + Propose { + choices: Vec, + }, + Vote { + proposal_id: u32, + vote: Vec, + }, + #[cw_orch(fn_name("proposal_execute"))] + Execute { + proposal_id: u32, + }, + Close { + proposal_id: u32, + }, SetConfig(UncheckedConfig), } diff --git a/contracts/proposal/dao-proposal-multiple/src/msg.rs b/contracts/proposal/dao-proposal-multiple/src/msg.rs index 071e8d802..6fcdfb80a 100644 --- a/contracts/proposal/dao-proposal-multiple/src/msg.rs +++ b/contracts/proposal/dao-proposal-multiple/src/msg.rs @@ -66,6 +66,7 @@ pub enum ExecuteMsg { }, /// Causes the messages associated with a passed proposal to be /// executed by the DAO. + #[cw_orch(fn_name("proposal_execute"))] Execute { /// The ID of the proposal to execute. proposal_id: u64, diff --git a/contracts/proposal/dao-proposal-single/src/msg.rs b/contracts/proposal/dao-proposal-single/src/msg.rs index 82e75f22f..dd500f1eb 100644 --- a/contracts/proposal/dao-proposal-single/src/msg.rs +++ b/contracts/proposal/dao-proposal-single/src/msg.rs @@ -71,6 +71,7 @@ pub enum ExecuteMsg { }, /// Causes the messages associated with a passed proposal to be /// executed by the DAO. + #[cw_orch(fn_name("proposal_execute"))] Execute { /// The ID of the proposal to execute. proposal_id: u64, diff --git a/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs b/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs index aedf0ca32..bc598f624 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs @@ -128,7 +128,7 @@ fn test_full_integration_with_factory() { // Error is insufficient funds as no funds were sent assert_eq!( RunnerError::ExecuteError { - msg: "failed to execute message; message index: 0: dispatch: submessages: 0uosmo is smaller than 1000uosmo: insufficient funds".to_string() + msg: "failed to execute message; message index: 0: dispatch: submessages: spendable balance is smaller than 1000uosmo: insufficient funds".to_string() }, err ); diff --git a/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json b/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json index 68d20647d..f98a2a360 100644 --- a/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json +++ b/contracts/voting/dao-voting-token-staked/schema/dao-voting-token-staked.json @@ -121,7 +121,7 @@ "type": "string" }, "exponent": { - "description": "exponent represents power of 10 exponent that one must raise the base_denom to in order to equal the given DenomUnit's denom 1 denom = 1^exponent base_denom (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with exponent = 6, thus: 1 atom = 10^6 uatom).", + "description": "exponent represents power of 10 exponent that one must raise the base_denom to in order to equal the given DenomUnit's denom 1 denom = 10^exponent base_denom (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with exponent = 6, thus: 1 atom = 10^6 uatom).", "type": "integer", "format": "uint32", "minimum": 0.0 diff --git a/contracts/voting/dao-voting-token-staked/src/contract.rs b/contracts/voting/dao-voting-token-staked/src/contract.rs index 33b85db11..77e749c36 100644 --- a/contracts/voting/dao-voting-token-staked/src/contract.rs +++ b/contracts/voting/dao-voting-token-staked/src/contract.rs @@ -633,7 +633,8 @@ pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> Result Result TokenVotingContract<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("token_voting"), &[], signer, )? @@ -398,7 +398,7 @@ impl<'a> TokenVotingContract<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("token_voting_contract"), &[], signer, )? diff --git a/packages/cw-orch/src/tests.rs b/packages/cw-orch/src/tests.rs index c3636e190..ac98c5ecf 100644 --- a/packages/cw-orch/src/tests.rs +++ b/packages/cw-orch/src/tests.rs @@ -7,11 +7,12 @@ use cw_orch::{ }; use crate::{ - Cw20Stake, Cw20StakeExternalRewards, Cw20StakeRewardDistributor, DaoDaoCore, - DaoPreProposeApprovalSingle, DaoPreProposeApprover, DaoPreProposeMultiple, DaoPreProposeSingle, - DaoProposalCondorcet, DaoProposalHookCounter, DaoProposalMultiple, DaoProposalSingle, - DaoProposalSudo, DaoTestCustomFactory, DaoVotingCw20Balance, DaoVotingCw20Staked, DaoVotingCw4, - DaoVotingCw721Roles, DaoVotingCw721Staked, DaoVotingTokenStaked, + DaoDaoCore, DaoPreProposeApprovalSingle, DaoPreProposeApprover, DaoPreProposeMultiple, + DaoPreProposeSingle, DaoProposalCondorcet, DaoProposalHookCounter, DaoProposalMultiple, + DaoProposalSingle, DaoProposalSudo, DaoStakingCw20, DaoStakingCw20ExternalRewards, + DaoStakingCw20RewardDistributor, DaoTestCustomFactory, DaoVotingCw20Balance, + DaoVotingCw20Staked, DaoVotingCw4, DaoVotingCw721Roles, DaoVotingCw721Staked, + DaoVotingTokenStaked, }; pub const DUMMY_CHAIN_INFO: ChainInfo = ChainInfo { @@ -44,9 +45,9 @@ fn test_all_wasms_different() { DaoProposalMultiple::::wasm(&DUMMY_CHAIN_INFO.into()), DaoProposalSingle::::wasm(&DUMMY_CHAIN_INFO.into()), // Stake - Cw20Stake::::wasm(&DUMMY_CHAIN_INFO.into()), - Cw20StakeExternalRewards::::wasm(&DUMMY_CHAIN_INFO.into()), - Cw20StakeRewardDistributor::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoStakingCw20::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoStakingCw20ExternalRewards::::wasm(&DUMMY_CHAIN_INFO.into()), + DaoStakingCw20RewardDistributor::::wasm(&DUMMY_CHAIN_INFO.into()), // Voting DaoVotingCw4::::wasm(&DUMMY_CHAIN_INFO.into()), DaoVotingCw20Staked::::wasm(&DUMMY_CHAIN_INFO.into()), diff --git a/packages/cw-tokenfactory-types/src/msg.rs b/packages/cw-tokenfactory-types/src/msg.rs index 8c2b061b9..9f2405944 100644 --- a/packages/cw-tokenfactory-types/src/msg.rs +++ b/packages/cw-tokenfactory-types/src/msg.rs @@ -61,6 +61,8 @@ mod tokenfactory_msg { display: metadata.display, name: metadata.name, symbol: metadata.symbol, + uri: metadata.uri, + uri_hash: metadata.uri_hash, }), } } diff --git a/packages/dao-testing/src/lib.rs b/packages/dao-testing/src/lib.rs index e0985b0fc..d9d874c4e 100644 --- a/packages/dao-testing/src/lib.rs +++ b/packages/dao-testing/src/lib.rs @@ -16,5 +16,9 @@ pub mod suite; #[cfg(not(target_arch = "wasm32"))] pub use suite::*; +// Integration tests using an actual chain binary, requires +// the "test-tube" feature to be enabled +// cargo test --features test-tube #[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "test-tube")] pub mod test_tube; diff --git a/packages/dao-testing/src/test_tube/cw4_group.rs b/packages/dao-testing/src/test_tube/cw4_group.rs index a40d407c7..944d3fd58 100644 --- a/packages/dao-testing/src/test_tube/cw4_group.rs +++ b/packages/dao-testing/src/test_tube/cw4_group.rs @@ -36,7 +36,7 @@ impl<'a> Cw4Group<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("cw4_group"), &[], signer, )? diff --git a/packages/dao-testing/src/test_tube/cw721_base.rs b/packages/dao-testing/src/test_tube/cw721_base.rs index 84c80b8fe..f5916c8f4 100644 --- a/packages/dao-testing/src/test_tube/cw721_base.rs +++ b/packages/dao-testing/src/test_tube/cw721_base.rs @@ -36,7 +36,7 @@ impl<'a> Cw721Base<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("cw721_base"), &[], signer, )? diff --git a/packages/dao-testing/src/test_tube/cw_admin_factory.rs b/packages/dao-testing/src/test_tube/cw_admin_factory.rs index 17675f5b2..4fddc7ea1 100644 --- a/packages/dao-testing/src/test_tube/cw_admin_factory.rs +++ b/packages/dao-testing/src/test_tube/cw_admin_factory.rs @@ -36,7 +36,7 @@ impl<'a> CwAdminFactory<'a> { code_id, &InstantiateMsg { admin }, Some(&signer.address()), - None, + Some("cw_admin_factory"), funds, signer, )? diff --git a/packages/dao-testing/src/test_tube/cw_tokenfactory_issuer.rs b/packages/dao-testing/src/test_tube/cw_tokenfactory_issuer.rs index 27ed1dcf0..813b3a57c 100644 --- a/packages/dao-testing/src/test_tube/cw_tokenfactory_issuer.rs +++ b/packages/dao-testing/src/test_tube/cw_tokenfactory_issuer.rs @@ -40,7 +40,7 @@ impl<'a> TokenfactoryIssuer<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("cw_tokenfactory_issuer"), &[token_creation_fee], signer, )? diff --git a/packages/dao-testing/src/test_tube/dao_dao_core.rs b/packages/dao-testing/src/test_tube/dao_dao_core.rs index 3fc9b73e7..06ea9b061 100644 --- a/packages/dao-testing/src/test_tube/dao_dao_core.rs +++ b/packages/dao-testing/src/test_tube/dao_dao_core.rs @@ -34,7 +34,7 @@ impl<'a> DaoCore<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("dao_dao_core"), funds, signer, )? diff --git a/packages/dao-testing/src/test_tube/dao_proposal_single.rs b/packages/dao-testing/src/test_tube/dao_proposal_single.rs index 4f6d51a96..68c40d733 100644 --- a/packages/dao-testing/src/test_tube/dao_proposal_single.rs +++ b/packages/dao-testing/src/test_tube/dao_proposal_single.rs @@ -37,7 +37,7 @@ impl<'a> DaoProposalSingle<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("dao_proposal_single"), &[token_creation_fee], signer, )? diff --git a/packages/dao-testing/src/test_tube/dao_test_custom_factory.rs b/packages/dao-testing/src/test_tube/dao_test_custom_factory.rs index 754374884..33cc5ed76 100644 --- a/packages/dao-testing/src/test_tube/dao_test_custom_factory.rs +++ b/packages/dao-testing/src/test_tube/dao_test_custom_factory.rs @@ -37,7 +37,7 @@ impl<'a> CustomFactoryContract<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("dao_test_custom_factory"), &[token_creation_fee], signer, )? diff --git a/packages/dao-testing/src/test_tube/dao_voting_cw4.rs b/packages/dao-testing/src/test_tube/dao_voting_cw4.rs index ce0fdac33..3589880c0 100644 --- a/packages/dao-testing/src/test_tube/dao_voting_cw4.rs +++ b/packages/dao-testing/src/test_tube/dao_voting_cw4.rs @@ -36,7 +36,7 @@ impl<'a> DaoVotingCw4<'a> { code_id, &instantiate_msg, Some(&signer.address()), - None, + Some("dao_voting_cw4"), funds, signer, )? diff --git a/packages/dao-testing/src/test_tube/mod.rs b/packages/dao-testing/src/test_tube/mod.rs index 107ea403d..7c8185c59 100644 --- a/packages/dao-testing/src/test_tube/mod.rs +++ b/packages/dao-testing/src/test_tube/mod.rs @@ -1,27 +1,8 @@ -// Integrationg tests using an actual chain binary, requires -// the "test-tube" feature to be enabled -// cargo test --features test-tube - -#[cfg(feature = "test-tube")] -pub mod cw_admin_factory; - -#[cfg(feature = "test-tube")] -pub mod cw_tokenfactory_issuer; - -#[cfg(feature = "test-tube")] pub mod cw4_group; - -#[cfg(feature = "test-tube")] pub mod cw721_base; - -#[cfg(feature = "test-tube")] +pub mod cw_admin_factory; +pub mod cw_tokenfactory_issuer; pub mod dao_dao_core; - -#[cfg(feature = "test-tube")] pub mod dao_proposal_single; - -#[cfg(feature = "test-tube")] pub mod dao_test_custom_factory; - -#[cfg(feature = "test-tube")] pub mod dao_voting_cw4;