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";