From 18ad305ec2bf55d27a70fc79da5c605818e76b19 Mon Sep 17 00:00:00 2001 From: Buckram Date: Fri, 25 Oct 2024 15:07:27 +0300 Subject: [PATCH 01/10] add multisig update --- framework/Cargo.lock | 5 +- .../packages/abstract-interface/Cargo.toml | 5 +- .../packages/abstract-interface/src/error.rs | 3 ++ .../packages/abstract-interface/src/lib.rs | 2 + .../abstract-interface/src/multisig.rs | 53 +++++++++++++++++++ 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 framework/packages/abstract-interface/src/multisig.rs diff --git a/framework/Cargo.lock b/framework/Cargo.lock index ad64e2097..e695e7221 100644 --- a/framework/Cargo.lock +++ b/framework/Cargo.lock @@ -362,7 +362,7 @@ dependencies = [ "abstract-sdk", "abstract-std", "abstract-testing", - "cosmrs 0.19.0", + "cosmrs 0.20.0", "cosmwasm-schema", "cosmwasm-std", "coverage-helper", @@ -372,12 +372,15 @@ dependencies = [ "cw-controllers", "cw-orch 0.26.0", "cw-orch-interchain", + "cw-plus-orch", "cw-storage-plus", "cw2", "cw20", "dotenv", "env_logger", "log", + "prost", + "prost-types", "rust-embed", "schemars", "semver", diff --git a/framework/packages/abstract-interface/Cargo.toml b/framework/packages/abstract-interface/Cargo.toml index f4aa09fca..953482c81 100644 --- a/framework/packages/abstract-interface/Cargo.toml +++ b/framework/packages/abstract-interface/Cargo.toml @@ -41,6 +41,7 @@ abstract-std = { workspace = true } cw-orch = { workspace = true } cw-orch-interchain = { workspace = true, optional = true } cw-orch-polytone = { workspace = true, optional = true } +cw-plus-orch = "0.25.0" log = "0.4.14" serde_json = "1.0.79" @@ -59,7 +60,9 @@ workspace-hack = { version = "0.1", path = "../../workspace-hack" } # Predictable abstract addresses cw-blob = { workspace = true } -cosmrs = { version = "0.19.0" } +cosmrs = { version = "0.20.0", features = ["cosmwasm"] } +prost-types = { version = "0.13.3" } +prost = { version = "0.13.3" } [build-dependencies] serde_json = "1.0.79" diff --git a/framework/packages/abstract-interface/src/error.rs b/framework/packages/abstract-interface/src/error.rs index 346835e0e..69ba3c744 100644 --- a/framework/packages/abstract-interface/src/error.rs +++ b/framework/packages/abstract-interface/src/error.rs @@ -29,6 +29,9 @@ pub enum AbstractInterfaceError { #[error("No matching module deployed {0:?}")] NoMatchingModule(StaticDependency), + + #[error("Multisig error: {0}")] + Multisig(String), } impl AbstractInterfaceError { diff --git a/framework/packages/abstract-interface/src/lib.rs b/framework/packages/abstract-interface/src/lib.rs index dda027b26..8d44b997b 100644 --- a/framework/packages/abstract-interface/src/lib.rs +++ b/framework/packages/abstract-interface/src/lib.rs @@ -28,3 +28,5 @@ pub use error::AbstractInterfaceError; pub use crate::{deployers::*, deployment::*}; pub use daemon_state::AbstractDaemonState; + +mod multisig; diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs new file mode 100644 index 000000000..c9fa0faf0 --- /dev/null +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -0,0 +1,53 @@ +use cosmrs::tx::Msg; +use cosmwasm_std::from_json; +use cw_orch::{contract::Contract, prelude::*}; +use cw_plus_orch::cw3_flex_multisig::{self, Cw3FlexMultisig}; +use prost::{Message, Name}; + +use crate::{Abstract, AbstractInterfaceError}; + +impl Abstract { + pub fn update_admin_to_cw3_flex( + &self, + cw3_flex_contract: Cw3FlexMultisig, + extra_contracts: impl IntoIterator>, + ) -> Result<(), AbstractInterfaceError> { + // Make sure we have cw3-flex + let chain = self.registry.environment().clone(); + let cw3_flex_address = cw3_flex_contract.address()?; + let cw2_of_cw3: cw2::ContractVersion = cosmwasm_std::from_json( + chain + .wasm_querier() + .raw_query(&cw3_flex_address, cw2::CONTRACT.as_slice().to_vec()) + .map_err(Into::into)?, + )?; + if !cw2_of_cw3.contract.contains("cw3-flex-multisig") { + return Err(AbstractInterfaceError::Multisig( + "cw3-flex-multisig contract info missmatch".to_string(), + )); + } + + for contract in self + .contracts() + .into_iter() + .map(|(contract, _version)| contract.clone()) + .chain(extra_contracts) + { + chain + .commit_any::( + vec![prost_types::Any { + value: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin { + sender: chain.sender_addr().to_string(), + new_admin: cw3_flex_address.to_string(), + contract: contract.address()?.to_string(), + } + .encode_to_vec(), + type_url: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin::type_url(), + }], + None, + ) + .map_err(Into::into)?; + } + Ok(()) + } +} From aad27dd1db7087fc95a706ac0b644b4900496a5a Mon Sep 17 00:00:00 2001 From: Buckram Date: Thu, 31 Oct 2024 18:42:09 +0200 Subject: [PATCH 02/10] add propose migrate --- framework/Cargo.lock | 3 + .../packages/abstract-interface/Cargo.toml | 7 +- .../abstract-interface/src/deployment.rs | 13 +- .../packages/abstract-interface/src/lib.rs | 2 +- .../abstract-interface/src/migrate.rs | 2 +- .../abstract-interface/src/multisig.rs | 265 +++++++++++++++--- .../abstract-interface/src/native/registry.rs | 2 +- 7 files changed, 254 insertions(+), 40 deletions(-) diff --git a/framework/Cargo.lock b/framework/Cargo.lock index e695e7221..60f9c0a7d 100644 --- a/framework/Cargo.lock +++ b/framework/Cargo.lock @@ -374,8 +374,11 @@ dependencies = [ "cw-orch-interchain", "cw-plus-orch", "cw-storage-plus", + "cw-utils", "cw2", "cw20", + "cw3", + "cw4", "dotenv", "env_logger", "log", diff --git a/framework/packages/abstract-interface/Cargo.toml b/framework/packages/abstract-interface/Cargo.toml index 953482c81..b45be2cc1 100644 --- a/framework/packages/abstract-interface/Cargo.toml +++ b/framework/packages/abstract-interface/Cargo.toml @@ -41,7 +41,6 @@ abstract-std = { workspace = true } cw-orch = { workspace = true } cw-orch-interchain = { workspace = true, optional = true } cw-orch-polytone = { workspace = true, optional = true } -cw-plus-orch = "0.25.0" log = "0.4.14" serde_json = "1.0.79" @@ -64,6 +63,12 @@ cosmrs = { version = "0.20.0", features = ["cosmwasm"] } prost-types = { version = "0.13.3" } prost = { version = "0.13.3" } +# Multisig +cw-plus-orch = "0.25.0" +cw-utils = "2.0.0" +cw3 = "2.0.0" +cw4 = "2.0.0" + [build-dependencies] serde_json = "1.0.79" diff --git a/framework/packages/abstract-interface/src/deployment.rs b/framework/packages/abstract-interface/src/deployment.rs index 52b05359d..5addbe08b 100644 --- a/framework/packages/abstract-interface/src/deployment.rs +++ b/framework/packages/abstract-interface/src/deployment.rs @@ -4,10 +4,11 @@ use cw_blob::interface::{CwBlob, DeterministicInstantiation}; use cw_orch::daemon::DeployedChains; use cw_orch::{mock::MockBase, prelude::*}; +use cw_plus_orch::cw3_flex_multisig::Cw3FlexMultisig; use crate::{ - get_ibc_contracts, get_native_contracts, AbstractIbc, AbstractInterfaceError, AccountI, - AnsHost, ModuleFactory, Registry, + get_ibc_contracts, get_native_contracts, multisig::AbstractMultisig, AbstractIbc, + AbstractInterfaceError, AccountI, AnsHost, ModuleFactory, Registry, }; use abstract_std::{native_addrs, ACCOUNT, ANS_HOST, MODULE_FACTORY, REGISTRY}; @@ -21,6 +22,7 @@ pub struct Abstract { pub ibc: AbstractIbc, pub(crate) account: AccountI, pub(crate) blob: CwBlob, + pub multisig: AbstractMultisig, } impl Deploy for Abstract { @@ -38,6 +40,8 @@ impl Deploy for Abstract { let ibc_infra = AbstractIbc::new(&chain); + let multisig = AbstractMultisig::new(&chain); + blob.upload_if_needed()?; ans_host.upload()?; registry.upload()?; @@ -52,6 +56,7 @@ impl Deploy for Abstract { account, ibc: ibc_infra, blob, + multisig, }; Ok(deployment) @@ -215,6 +220,7 @@ impl Abstract { let (ans_host, registry, module_factory) = get_native_contracts(chain.clone()); let (ibc_client, ibc_host) = get_ibc_contracts(chain.clone()); let account = AccountI::new(ACCOUNT, chain.clone()); + let multisig = AbstractMultisig::new(&chain); Self { account, ans_host, @@ -224,6 +230,7 @@ impl Abstract { client: ibc_client, host: ibc_host, }, + multisig, blob: CwBlob::new(CW_BLOB, chain), } } @@ -300,6 +307,7 @@ impl Abstract { ibc, account, blob: _, + multisig: _, } = self; ans_host.set_sender(sender); registry.set_sender(sender); @@ -317,6 +325,7 @@ impl Abstract { ibc: self.ibc.call_as(sender), account: self.account.call_as(sender), blob: self.blob.clone(), + multisig: self.multisig.clone(), } } } diff --git a/framework/packages/abstract-interface/src/lib.rs b/framework/packages/abstract-interface/src/lib.rs index 8d44b997b..480d27759 100644 --- a/framework/packages/abstract-interface/src/lib.rs +++ b/framework/packages/abstract-interface/src/lib.rs @@ -29,4 +29,4 @@ pub use crate::{deployers::*, deployment::*}; pub use daemon_state::AbstractDaemonState; -mod multisig; +pub mod multisig; diff --git a/framework/packages/abstract-interface/src/migrate.rs b/framework/packages/abstract-interface/src/migrate.rs index 331e24c70..0e283b17d 100644 --- a/framework/packages/abstract-interface/src/migrate.rs +++ b/framework/packages/abstract-interface/src/migrate.rs @@ -200,7 +200,7 @@ impl Abstract { } } -fn contract_version>( +pub(crate) fn contract_version>( contract: &A, ) -> Result { let wasm_querier = contract.environment().wasm_querier(); diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index c9fa0faf0..1b91b04b9 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -1,53 +1,250 @@ +use abstract_std::{ + ans_host, ibc_client, ibc_host, ica_client, module_factory, + objects::{module::ModuleInfo, module_reference::ModuleReference}, + registry::{self, QueryMsgFns}, + ACCOUNT, +}; use cosmrs::tx::Msg; -use cosmwasm_std::from_json; +use cosmwasm_std::{from_json, to_json_binary, CosmosMsg, WasmMsg}; use cw_orch::{contract::Contract, prelude::*}; -use cw_plus_orch::cw3_flex_multisig::{self, Cw3FlexMultisig}; +use cw_plus_orch::{ + cw3_flex_multisig::{self, Cw3FlexMultisig}, + cw4_group::{self, Cw4Group}, +}; use prost::{Message, Name}; -use crate::{Abstract, AbstractInterfaceError}; +use crate::{migrate::contract_version, Abstract, AbstractInterfaceError}; + +pub const CW3_ABSTRACT: &str = "cw3:abstract"; +pub const CW4_ABSTRACT: &str = "cw4:abstract"; + +#[derive(Clone)] +pub struct AbstractMultisig { + pub cw3: Cw3FlexMultisig, + pub cw4: Cw4Group, +} + +impl AbstractMultisig { + pub fn new(chain: &Chain) -> Self { + let cw3 = Cw3FlexMultisig::new(CW3_ABSTRACT, chain.clone()); + let cw4 = Cw4Group::new(CW4_ABSTRACT, chain.clone()); + Self { cw3, cw4 } + } + + pub fn upload_if_needed(&self) -> Result<(), crate::AbstractInterfaceError> { + self.cw3.upload_if_needed()?; + self.cw4.upload_if_needed()?; + Ok(()) + } + + // List of members + pub fn instantiate(&self, admin: String, members: Vec) -> Result<(), CwOrchError> { + let contract_admin = Addr::unchecked(admin.clone()); + let resp = self.cw4.instantiate( + &cw4_group::InstantiateMsg { + admin: Some(admin), + members, + }, + Some(&contract_admin), + &[], + )?; + let cw4_address = resp.instantiated_contract_address()?; + + self.cw3.instantiate( + &cw3_flex_multisig::InstantiateMsg { + group_addr: cw4_address.to_string(), + threshold: cw_utils::Threshold::AbsolutePercentage { + percentage: cosmwasm_std::Decimal::from_ratio(1_u128, 2_u128), + }, + max_voting_period: cw_utils::WEEK, + executor: None, + proposal_deposit: None, + }, + Some(&contract_admin), + &[], + )?; + + Ok(()) + } +} impl Abstract { - pub fn update_admin_to_cw3_flex( + pub fn update_admin_to_multisig( &self, - cw3_flex_contract: Cw3FlexMultisig, + admin: String, + members: Vec, extra_contracts: impl IntoIterator>, ) -> Result<(), AbstractInterfaceError> { - // Make sure we have cw3-flex + self.multisig.upload_if_needed()?; + self.multisig.instantiate(admin, members)?; + let chain = self.registry.environment().clone(); - let cw3_flex_address = cw3_flex_contract.address()?; - let cw2_of_cw3: cw2::ContractVersion = cosmwasm_std::from_json( - chain - .wasm_querier() - .raw_query(&cw3_flex_address, cw2::CONTRACT.as_slice().to_vec()) - .map_err(Into::into)?, - )?; - if !cw2_of_cw3.contract.contains("cw3-flex-multisig") { - return Err(AbstractInterfaceError::Multisig( - "cw3-flex-multisig contract info missmatch".to_string(), - )); - } + let cw3_flex_address = self.multisig.cw3.address()?; - for contract in self + let admin_upgrades = self .contracts() .into_iter() .map(|(contract, _version)| contract.clone()) .chain(extra_contracts) + .map(|contract| prost_types::Any { + value: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin { + sender: chain.sender_addr().to_string(), + new_admin: cw3_flex_address.to_string(), + contract: contract.address().unwrap().to_string(), + } + .encode_to_vec(), + type_url: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin::type_url(), + }) + .collect::>(); + chain + .commit_any::( + admin_upgrades, + None, + ) + .map_err(Into::into)?; + Ok(()) + } + + /// Create proposal for migration of the deployment based on version changes. If the registered contracts have the right version, we don't propose migration + pub fn propose_migrate_if_version_changed( + &self, + ) -> Result { + let mut has_uploaded = false; + let mut msgs: Vec = vec![]; + let mut natives_to_register = vec![]; + // cw3_flex_multisig::ExecuteMsg::Propose { + // title: "Migrate Abstract Deployment".to_owned(), + // description: (), + // msgs: (), + // latest: None, + // }; + + if ::module_factory::contract::CONTRACT_VERSION + != contract_version(&self.module_factory)?.version { - chain - .commit_any::( - vec![prost_types::Any { - value: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin { - sender: chain.sender_addr().to_string(), - new_admin: cw3_flex_address.to_string(), - contract: contract.address()?.to_string(), - } - .encode_to_vec(), - type_url: cosmrs::proto::cosmwasm::wasm::v1::MsgUpdateAdmin::type_url(), - }], - None, - ) - .map_err(Into::into)?; + let uploading_result = self.module_factory.upload_if_needed()?; + if let Some(result) = uploading_result { + let new_code_id = result.uploaded_code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.module_factory.as_instance(), + ::module_factory::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.module_factory.addr_str()?, + new_code_id, + msg: to_json_binary(&module_factory::MigrateMsg::Migrate {})?, + })); + } } - Ok(()) + + if ::registry::contract::CONTRACT_VERSION != contract_version(&self.registry)?.version { + let uploading_result = self.registry.upload_if_needed()?; + if let Some(result) = uploading_result { + let new_code_id = result.uploaded_code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.registry.as_instance(), + ::registry::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.registry.addr_str()?, + new_code_id, + msg: to_json_binary(®istry::MigrateMsg::Migrate {})?, + })); + } + } + + if ::ans_host::contract::CONTRACT_VERSION != contract_version(&self.ans_host)?.version { + let uploading_result = self.ans_host.upload_if_needed()?; + if let Some(result) = uploading_result { + let new_code_id = result.uploaded_code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ans_host.as_instance(), + ::ans_host::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ans_host.addr_str()?, + new_code_id, + msg: to_json_binary(&ans_host::MigrateMsg::Migrate {})?, + })); + } + } + + // TODO: are we keeping migrate or instantiate on breaking ibc bump + if ::ibc_client::contract::CONTRACT_VERSION != contract_version(&self.ibc.client)?.version { + let uploading_result = self.ibc.client.upload_if_needed()?; + if let Some(result) = uploading_result { + let new_code_id = result.uploaded_code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ibc.client.as_instance(), + ::ibc_client::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ibc.client.addr_str()?, + new_code_id, + msg: to_json_binary(&ibc_client::MigrateMsg::Migrate {})?, + })); + } + } + if ::ibc_host::contract::CONTRACT_VERSION != contract_version(&self.ibc.host)?.version { + let uploading_result = self.ibc.host.upload_if_needed()?; + if let Some(result) = uploading_result { + let new_code_id = result.uploaded_code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ibc.host.as_instance(), + ::ibc_host::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ibc.host.addr_str()?, + new_code_id, + msg: to_json_binary(&ibc_host::MigrateMsg::Migrate {})?, + })); + } + } + + // We need to check the version in registry for the account contract + let account = self.registry.module(ModuleInfo::from_id_latest(ACCOUNT)?)?; + + let mut modules_to_register = self + .registry + .contracts_into_module_entries(natives_to_register, |c| { + ModuleReference::Native(c.address().unwrap()) + })?; + + if ::account::contract::CONTRACT_VERSION != account.info.version.to_string() + && self.account.upload_if_needed()?.is_some() + { + modules_to_register.push(( + ModuleInfo::from_id(ACCOUNT, ::account::contract::CONTRACT_VERSION.parse()?)?, + ModuleReference::Account(self.account.code_id()?), + )); + + has_uploaded = true + } + + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { + modules: modules_to_register.clone(), + })?, + funds: vec![], + })); + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::ApproveOrRejectModules { + approves: modules_to_register + .into_iter() + .map(|(info, _reference)| info) + .collect(), + rejects: vec![], + })?, + funds: vec![], + })); + + Ok(has_uploaded) } } diff --git a/framework/packages/abstract-interface/src/native/registry.rs b/framework/packages/abstract-interface/src/native/registry.rs index f1fff72f9..f9911fd35 100644 --- a/framework/packages/abstract-interface/src/native/registry.rs +++ b/framework/packages/abstract-interface/src/native/registry.rs @@ -321,7 +321,7 @@ impl Registry { Ok(()) } - fn contracts_into_module_entries( + pub(crate) fn contracts_into_module_entries( &self, modules: Vec<(&Contract, VersionString)>, ref_fn: RefFn, From de880539b5e78b5d0f42b3276150b0a180d1c716 Mon Sep 17 00:00:00 2001 From: Buckram Date: Fri, 1 Nov 2024 12:58:25 +0200 Subject: [PATCH 03/10] add small interchain script --- framework/Cargo.lock | 1 + .../packages/abstract-interface/Cargo.toml | 1 + .../abstract-interface/src/multisig.rs | 125 +++++++++++++++++- .../scripts/src/bin/update_to_multisig.rs | 23 ++++ 4 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 interchain/scripts/src/bin/update_to_multisig.rs diff --git a/framework/Cargo.lock b/framework/Cargo.lock index 60f9c0a7d..d5150e21c 100644 --- a/framework/Cargo.lock +++ b/framework/Cargo.lock @@ -372,6 +372,7 @@ dependencies = [ "cw-controllers", "cw-orch 0.26.0", "cw-orch-interchain", + "cw-ownable", "cw-plus-orch", "cw-storage-plus", "cw-utils", diff --git a/framework/packages/abstract-interface/Cargo.toml b/framework/packages/abstract-interface/Cargo.toml index b45be2cc1..c0842bc15 100644 --- a/framework/packages/abstract-interface/Cargo.toml +++ b/framework/packages/abstract-interface/Cargo.toml @@ -68,6 +68,7 @@ cw-plus-orch = "0.25.0" cw-utils = "2.0.0" cw3 = "2.0.0" cw4 = "2.0.0" +cw-ownable = { workspace = true } [build-dependencies] serde_json = "1.0.79" diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index 1b91b04b9..863259346 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -1,14 +1,23 @@ use abstract_std::{ - ans_host, ibc_client, ibc_host, ica_client, module_factory, - objects::{module::ModuleInfo, module_reference::ModuleReference}, - registry::{self, QueryMsgFns}, + account::{self, ExecuteMsgFns as _}, + ans_host::{self, ExecuteMsgFns as _}, + ibc_client::{self, ExecuteMsgFns as _}, + ibc_host::{self, ExecuteMsgFns as _}, + ica_client, + module_factory::{self, ExecuteMsgFns as _}, + objects::{ + gov_type::{GovAction, GovernanceDetails}, + module::ModuleInfo, + module_reference::ModuleReference, + }, + registry::{self, ExecuteMsgFns as _, QueryMsgFns as _}, ACCOUNT, }; use cosmrs::tx::Msg; use cosmwasm_std::{from_json, to_json_binary, CosmosMsg, WasmMsg}; use cw_orch::{contract::Contract, prelude::*}; use cw_plus_orch::{ - cw3_flex_multisig::{self, Cw3FlexMultisig}, + cw3_flex_multisig::{self, Cw3FlexMultisig, ExecuteMsgInterfaceFns}, cw4_group::{self, Cw4Group}, }; use prost::{Message, Name}; @@ -81,7 +90,7 @@ impl Abstract { let chain = self.registry.environment().clone(); let cw3_flex_address = self.multisig.cw3.address()?; - let admin_upgrades = self + let contract_admin_upgrades = self .contracts() .into_iter() .map(|(contract, _version)| contract.clone()) @@ -98,10 +107,108 @@ impl Abstract { .collect::>(); chain .commit_any::( - admin_upgrades, + contract_admin_upgrades, None, ) .map_err(Into::into)?; + + let mut msgs = vec![]; + // Transfer ownership + let cw_ownable_transfer_msg = cw_ownable::Action::TransferOwnership { + new_owner: cw3_flex_address.to_string(), + expiry: None, + }; + + // Registry + self.registry + .update_ownership(cw_ownable_transfer_msg.clone())?; + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::UpdateOwnership( + cw_ownable::Action::AcceptOwnership, + ))?, + funds: vec![], + })); + + // Ans host + self.ans_host + .update_ownership(cw_ownable_transfer_msg.clone())?; + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(&ans_host::ExecuteMsg::UpdateOwnership( + cw_ownable::Action::AcceptOwnership, + ))?, + funds: vec![], + })); + + // Module factory + self.module_factory + .update_ownership(cw_ownable_transfer_msg.clone())?; + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(&module_factory::ExecuteMsg::UpdateOwnership( + cw_ownable::Action::AcceptOwnership, + ))?, + funds: vec![], + })); + + // IBC Client + self.ibc + .client + .update_ownership(cw_ownable_transfer_msg.clone())?; + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(&ibc_client::ExecuteMsg::UpdateOwnership( + cw_ownable::Action::AcceptOwnership, + ))?, + funds: vec![], + })); + + // IBC Host + self.ibc + .host + .update_ownership(cw_ownable_transfer_msg.clone())?; + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(&ibc_host::ExecuteMsg::UpdateOwnership( + cw_ownable::Action::AcceptOwnership, + ))?, + funds: vec![], + })); + + // Accept new contracts owners + let title = "Accept ownership of abstract contracts as multisig".to_owned(); + let description = "".to_owned(); + self.multisig + .cw3 + .propose(description, msgs, title, None, &[])?; + + // Move ownership of the account + self.account + .update_ownership(GovAction::TransferOwnership { + new_owner: GovernanceDetails::External { + governance_address: cw3_flex_address.to_string(), + governance_type: "cw3-flex".to_owned(), + }, + expiry: None, + })?; + // Accept new account owner + let title = "Accept ownership of abstract account as multisig".to_owned(); + let description = "".to_owned(); + self.multisig.cw3.propose( + description, + vec![CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.account.addr_str()?, + msg: to_json_binary(&::UpdateOwnership( + GovAction::AcceptOwnership, + ))?, + funds: vec![], + })], + title, + None, + &[], + )?; + Ok(()) } @@ -245,6 +352,12 @@ impl Abstract { funds: vec![], })); + let title = "Migrate native contracts of the abstract".to_owned(); + let description = "".to_owned(); + self.multisig + .cw3 + .propose(description, msgs, title, None, &[])?; + Ok(has_uploaded) } } diff --git a/interchain/scripts/src/bin/update_to_multisig.rs b/interchain/scripts/src/bin/update_to_multisig.rs new file mode 100644 index 000000000..eee6c0853 --- /dev/null +++ b/interchain/scripts/src/bin/update_to_multisig.rs @@ -0,0 +1,23 @@ +use abstract_interface::Abstract; +use cw_orch::prelude::*; +use networks::LOCAL_JUNO; + +fn main() -> anyhow::Result<()> { + dotenv().ok(); + env_logger::init(); + use dotenv::dotenv; + + // Fill members + let members = vec![]; + assert!(!members.is_empty(), "Fill multisig members first"); + + // Change network + let network = LOCAL_JUNO; + + let chain = DaemonBuilder::new(network).build()?; + let deployment = Abstract::load_from(chain.clone())?; + + deployment.update_admin_to_multisig(chain.sender_addr().to_string(), members, [])?; + + Ok(()) +} From 453410a7755472e800241f295afb38488ee6651b Mon Sep 17 00:00:00 2001 From: Buckram Date: Mon, 4 Nov 2024 11:39:07 +0200 Subject: [PATCH 04/10] small updates --- .../abstract-interface/src/multisig.rs | 25 +++++++++++-------- interchain/scripts/Cargo.toml | 1 + 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index 863259346..3f92980f0 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -9,6 +9,7 @@ use abstract_std::{ gov_type::{GovAction, GovernanceDetails}, module::ModuleInfo, module_reference::ModuleReference, + ABSTRACT_ACCOUNT_ID, }, registry::{self, ExecuteMsgFns as _, QueryMsgFns as _}, ACCOUNT, @@ -22,7 +23,7 @@ use cw_plus_orch::{ }; use prost::{Message, Name}; -use crate::{migrate::contract_version, Abstract, AbstractInterfaceError}; +use crate::{migrate::contract_version, Abstract, AbstractInterfaceError, AccountI}; pub const CW3_ABSTRACT: &str = "cw3:abstract"; pub const CW4_ABSTRACT: &str = "cw4:abstract"; @@ -111,6 +112,7 @@ impl Abstract { None, ) .map_err(Into::into)?; + log::info!("Updated migrate admin of abstract contracts"); let mut msgs = vec![]; // Transfer ownership @@ -182,23 +184,25 @@ impl Abstract { self.multisig .cw3 .propose(description, msgs, title, None, &[])?; + log::info!("Created proposal to update ownerships of abstract contracts"); // Move ownership of the account - self.account - .update_ownership(GovAction::TransferOwnership { - new_owner: GovernanceDetails::External { - governance_address: cw3_flex_address.to_string(), - governance_type: "cw3-flex".to_owned(), - }, - expiry: None, - })?; + let root_account = AccountI::load_from(&self, ABSTRACT_ACCOUNT_ID)?; + root_account.update_ownership(GovAction::TransferOwnership { + new_owner: GovernanceDetails::External { + governance_address: cw3_flex_address.to_string(), + governance_type: "cw3-flex".to_owned(), + }, + expiry: None, + })?; + // Accept new account owner let title = "Accept ownership of abstract account as multisig".to_owned(); let description = "".to_owned(); self.multisig.cw3.propose( description, vec![CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.account.addr_str()?, + contract_addr: root_account.addr_str()?, msg: to_json_binary(&::UpdateOwnership( GovAction::AcceptOwnership, ))?, @@ -208,6 +212,7 @@ impl Abstract { None, &[], )?; + log::info!("Created proposal to update abstract root account governance"); Ok(()) } diff --git a/interchain/scripts/Cargo.toml b/interchain/scripts/Cargo.toml index 779a1ca27..6436e2dda 100644 --- a/interchain/scripts/Cargo.toml +++ b/interchain/scripts/Cargo.toml @@ -64,3 +64,4 @@ prost = { version = "0.13" } prost-types = { version = "0.13" } cw-orch-core = "2.0.0" +cw4 = "2.0.0" From a016c680fa9e9a04b8a86bcc2ce135297eb8644b Mon Sep 17 00:00:00 2001 From: Buckram Date: Mon, 4 Nov 2024 14:37:20 +0200 Subject: [PATCH 05/10] fixes after tests --- .../abstract-interface/src/multisig.rs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index 3f92980f0..9a2b95a2f 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -23,7 +23,7 @@ use cw_plus_orch::{ }; use prost::{Message, Name}; -use crate::{migrate::contract_version, Abstract, AbstractInterfaceError, AccountI}; +use crate::{Abstract, AbstractInterfaceError, AccountI}; pub const CW3_ABSTRACT: &str = "cw3:abstract"; pub const CW4_ABSTRACT: &str = "cw4:abstract"; @@ -64,7 +64,7 @@ impl AbstractMultisig { &cw3_flex_multisig::InstantiateMsg { group_addr: cw4_address.to_string(), threshold: cw_utils::Threshold::AbsolutePercentage { - percentage: cosmwasm_std::Decimal::from_ratio(1_u128, 2_u128), + percentage: cosmwasm_std::Decimal::from_ratio(51_u128, 100_u128), }, max_voting_period: cw_utils::WEEK, executor: None, @@ -78,6 +78,7 @@ impl AbstractMultisig { } } +#[cfg(feature = "daemon")] impl Abstract { pub fn update_admin_to_multisig( &self, @@ -136,7 +137,7 @@ impl Abstract { self.ans_host .update_ownership(cw_ownable_transfer_msg.clone())?; msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, + contract_addr: self.ans_host.addr_str()?, msg: to_json_binary(&ans_host::ExecuteMsg::UpdateOwnership( cw_ownable::Action::AcceptOwnership, ))?, @@ -147,7 +148,7 @@ impl Abstract { self.module_factory .update_ownership(cw_ownable_transfer_msg.clone())?; msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, + contract_addr: self.module_factory.addr_str()?, msg: to_json_binary(&module_factory::ExecuteMsg::UpdateOwnership( cw_ownable::Action::AcceptOwnership, ))?, @@ -159,7 +160,7 @@ impl Abstract { .client .update_ownership(cw_ownable_transfer_msg.clone())?; msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, + contract_addr: self.ibc.client.addr_str()?, msg: to_json_binary(&ibc_client::ExecuteMsg::UpdateOwnership( cw_ownable::Action::AcceptOwnership, ))?, @@ -171,7 +172,7 @@ impl Abstract { .host .update_ownership(cw_ownable_transfer_msg.clone())?; msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, + contract_addr: self.ibc.host.addr_str()?, msg: to_json_binary(&ibc_host::ExecuteMsg::UpdateOwnership( cw_ownable::Action::AcceptOwnership, ))?, @@ -180,7 +181,7 @@ impl Abstract { // Accept new contracts owners let title = "Accept ownership of abstract contracts as multisig".to_owned(); - let description = "".to_owned(); + let description = "We should accept ownership of abstract contracts as multisig so our root account is not managed by a single wallet".to_owned(); self.multisig .cw3 .propose(description, msgs, title, None, &[])?; @@ -197,8 +198,8 @@ impl Abstract { })?; // Accept new account owner - let title = "Accept ownership of abstract account as multisig".to_owned(); - let description = "".to_owned(); + let title = "Accept ownership of abstract account".to_owned(); + let description = "We should accept ownership of abstract account as multisig so our root account is not managed by a single wallet".to_owned(); self.multisig.cw3.propose( description, vec![CosmosMsg::Wasm(WasmMsg::Execute { @@ -232,7 +233,7 @@ impl Abstract { // }; if ::module_factory::contract::CONTRACT_VERSION - != contract_version(&self.module_factory)?.version + != crate::migrate::contract_version(&self.module_factory)?.version { let uploading_result = self.module_factory.upload_if_needed()?; if let Some(result) = uploading_result { @@ -250,7 +251,9 @@ impl Abstract { } } - if ::registry::contract::CONTRACT_VERSION != contract_version(&self.registry)?.version { + if ::registry::contract::CONTRACT_VERSION + != crate::migrate::contract_version(&self.registry)?.version + { let uploading_result = self.registry.upload_if_needed()?; if let Some(result) = uploading_result { let new_code_id = result.uploaded_code_id()?; @@ -267,7 +270,9 @@ impl Abstract { } } - if ::ans_host::contract::CONTRACT_VERSION != contract_version(&self.ans_host)?.version { + if ::ans_host::contract::CONTRACT_VERSION + != crate::migrate::contract_version(&self.ans_host)?.version + { let uploading_result = self.ans_host.upload_if_needed()?; if let Some(result) = uploading_result { let new_code_id = result.uploaded_code_id()?; @@ -285,7 +290,9 @@ impl Abstract { } // TODO: are we keeping migrate or instantiate on breaking ibc bump - if ::ibc_client::contract::CONTRACT_VERSION != contract_version(&self.ibc.client)?.version { + if ::ibc_client::contract::CONTRACT_VERSION + != crate::migrate::contract_version(&self.ibc.client)?.version + { let uploading_result = self.ibc.client.upload_if_needed()?; if let Some(result) = uploading_result { let new_code_id = result.uploaded_code_id()?; @@ -301,7 +308,9 @@ impl Abstract { })); } } - if ::ibc_host::contract::CONTRACT_VERSION != contract_version(&self.ibc.host)?.version { + if ::ibc_host::contract::CONTRACT_VERSION + != crate::migrate::contract_version(&self.ibc.host)?.version + { let uploading_result = self.ibc.host.upload_if_needed()?; if let Some(result) = uploading_result { let new_code_id = result.uploaded_code_id()?; From 25799912cc862d6f0d766ebc127a759b27d62aba Mon Sep 17 00:00:00 2001 From: Buckram Date: Fri, 8 Nov 2024 13:51:32 +0200 Subject: [PATCH 06/10] clippy --- .../abstract-interface/src/deployment.rs | 1 - .../packages/abstract-interface/src/multisig.rs | 16 +++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/framework/packages/abstract-interface/src/deployment.rs b/framework/packages/abstract-interface/src/deployment.rs index 5addbe08b..11ac7d36b 100644 --- a/framework/packages/abstract-interface/src/deployment.rs +++ b/framework/packages/abstract-interface/src/deployment.rs @@ -4,7 +4,6 @@ use cw_blob::interface::{CwBlob, DeterministicInstantiation}; use cw_orch::daemon::DeployedChains; use cw_orch::{mock::MockBase, prelude::*}; -use cw_plus_orch::cw3_flex_multisig::Cw3FlexMultisig; use crate::{ get_ibc_contracts, get_native_contracts, multisig::AbstractMultisig, AbstractIbc, diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index 9a2b95a2f..07dc369ab 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -3,7 +3,6 @@ use abstract_std::{ ans_host::{self, ExecuteMsgFns as _}, ibc_client::{self, ExecuteMsgFns as _}, ibc_host::{self, ExecuteMsgFns as _}, - ica_client, module_factory::{self, ExecuteMsgFns as _}, objects::{ gov_type::{GovAction, GovernanceDetails}, @@ -11,11 +10,10 @@ use abstract_std::{ module_reference::ModuleReference, ABSTRACT_ACCOUNT_ID, }, - registry::{self, ExecuteMsgFns as _, QueryMsgFns as _}, + registry::{self, ExecuteMsgFns as _}, ACCOUNT, }; -use cosmrs::tx::Msg; -use cosmwasm_std::{from_json, to_json_binary, CosmosMsg, WasmMsg}; +use cosmwasm_std::{to_json_binary, CosmosMsg, WasmMsg}; use cw_orch::{contract::Contract, prelude::*}; use cw_plus_orch::{ cw3_flex_multisig::{self, Cw3FlexMultisig, ExecuteMsgInterfaceFns}, @@ -289,7 +287,7 @@ impl Abstract { } } - // TODO: are we keeping migrate or instantiate on breaking ibc bump + // TODO: reimplement desired logic here after #531 merged if ::ibc_client::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.ibc.client)?.version { @@ -327,15 +325,15 @@ impl Abstract { } } - // We need to check the version in registry for the account contract - let account = self.registry.module(ModuleInfo::from_id_latest(ACCOUNT)?)?; - let mut modules_to_register = self .registry .contracts_into_module_entries(natives_to_register, |c| { ModuleReference::Native(c.address().unwrap()) })?; + // We need to check the version in registry for the account contract + let account = self.registry.module(ModuleInfo::from_id_latest(ACCOUNT)?)?; + if ::account::contract::CONTRACT_VERSION != account.info.version.to_string() && self.account.upload_if_needed()?.is_some() { @@ -367,7 +365,7 @@ impl Abstract { })); let title = "Migrate native contracts of the abstract".to_owned(); - let description = "".to_owned(); + let description = "We should upgrade abstract contracts to a new versions".to_owned(); self.multisig .cw3 .propose(description, msgs, title, None, &[])?; From c5ac5ccd27c12606d03dfd12f08357a971aaa03e Mon Sep 17 00:00:00 2001 From: Buckram Date: Fri, 8 Nov 2024 16:33:26 +0200 Subject: [PATCH 07/10] upgrades --- framework/Cargo.lock | 487 +++++++++++++----- .../abstract-interface/src/multisig.rs | 206 ++++---- interchain/scripts/src/bin/propose_migrate.rs | 58 +++ .../scripts/src/bin/update_to_multisig.rs | 23 +- 4 files changed, 555 insertions(+), 219 deletions(-) create mode 100644 interchain/scripts/src/bin/propose_migrate.rs diff --git a/framework/Cargo.lock b/framework/Cargo.lock index cc0081592..6a2c6fd64 100644 --- a/framework/Cargo.lock +++ b/framework/Cargo.lock @@ -171,9 +171,9 @@ dependencies = [ [[package]] name = "abstract-cw-multi-test" -version = "2.1.2" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12838503965771af5d9299a208548180e8acbbe0507abc33c9f827f0cc61b7db" +checksum = "26ce11298aa1e7480bcd52e44dc5fa3be29370ba0c166bde3ae33ddef64eff5b" dependencies = [ "anyhow", "bech32 0.11.0", @@ -182,7 +182,6 @@ dependencies = [ "cw-storage-plus", "cw-utils", "cw20-ics20", - "derivative", "hex", "itertools 0.13.0", "log", @@ -688,7 +687,7 @@ dependencies = [ [[package]] name = "account" version = "0.1.0" -source = "git+https://github.com/abstractsdk/xion-contracts?branch=fix-for-abstract#20a72eddeee7c0e32ef701d6878049599b4201de" +source = "git+https://github.com/abstractsdk/xion-contracts?branch=fix-for-abstract#6493190c7fa9259f5658c3cd5e608325052aedb3" dependencies = [ "absacc", "base64 0.21.7", @@ -801,7 +800,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -817,7 +816,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", "tiny-keccak", ] @@ -833,7 +832,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", ] @@ -865,9 +864,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -880,9 +879,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -920,9 +919,9 @@ checksum = "cb5f1dee23caf80904249463cc4493b6789c2250f88c8f8d9160de5c6099bfe7" [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arc-swap" @@ -1089,7 +1088,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1111,7 +1110,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1122,7 +1121,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1380,9 +1379,9 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.32.3" +version = "0.32.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0032b0e8ead7074cda7fc4f034409607e3f03a6f71d66ade8a307f79b4d99e73" +checksum = "788902099d47c8682efe6a7afb01c8d58b9794ba66c06affd81c3d6b560743eb" dependencies = [ "base58ck", "bech32 0.11.0", @@ -1412,9 +1411,9 @@ checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" [[package]] name = "bitcoin-io" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin-units" @@ -1557,9 +1556,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" dependencies = [ "shlex", ] @@ -1616,7 +1615,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1842,7 +1841,7 @@ checksum = "1b5658b1dc64e10b56ae7a449f678f96932a96f6cfad1769d608d1d1d656480a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1866,7 +1865,7 @@ checksum = "c8ef1b5835a65fcca3ab8b9a02b4f4dacc78e233a5c2f20b270efb9db0666d12" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2002,7 +2001,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2133,7 +2132,7 @@ checksum = "bad52865e313bb7ed3f3938f7ad9d566e430fb6143a63476c22bed505ea78cd7" dependencies = [ "convert_case 0.6.0", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2158,9 +2157,9 @@ dependencies = [ [[package]] name = "cw-orch-daemon" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b727ba2031725ee51ecafaa101770827689cd61f3b1f4465ad56237606a500" +checksum = "eb318421ff15d3760f21cb851de41b3b6a82cc42bedddebe2abb677507fbc752" dependencies = [ "anyhow", "async-recursion", @@ -2168,7 +2167,7 @@ dependencies = [ "base64 0.22.1", "bech32 0.11.0", "bip39", - "bitcoin 0.32.3", + "bitcoin 0.32.4", "chrono", "cosmrs 0.19.0", "cosmwasm-std", @@ -2189,7 +2188,7 @@ dependencies = [ "prost", "prost-types", "rand_core", - "reqwest 0.12.8", + "reqwest 0.12.9", "ring", "ripemd", "schemars", @@ -2212,7 +2211,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2223,7 +2222,7 @@ checksum = "85806182382aef051a318b9abb41af559e6d7733fbba3c04c42ed23cc03d8e1a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2317,9 +2316,9 @@ dependencies = [ [[package]] name = "cw-orch-mock" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed827dedba3e64ba7372dd9edfcf4e174d0ad3fccc33b648590bd0f0c8a71e3" +checksum = "aa1151a4ed23b986dd197959c5a090a54710512913b033e202625c53ea8ae239" dependencies = [ "abstract-cw-multi-test", "cosmwasm-std", @@ -2355,7 +2354,7 @@ dependencies = [ "k8s-openapi", "kube", "log", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "thiserror", @@ -2731,7 +2730,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2753,7 +2752,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2851,7 +2850,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2871,7 +2870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2884,7 +2883,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2904,7 +2903,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "unicode-xid", ] @@ -3012,6 +3011,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -3248,9 +3258,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "ff" @@ -3417,7 +3427,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3581,9 +3591,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "hashlink" @@ -3870,7 +3880,7 @@ dependencies = [ "hyper 1.5.0", "hyper-util", "log", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", @@ -3880,9 +3890,9 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ "hyper 1.5.0", "hyper-util", @@ -3909,9 +3919,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -4124,6 +4134,124 @@ dependencies = [ "sha3", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -4132,12 +4260,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -4172,7 +4311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", ] [[package]] @@ -4187,9 +4326,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" dependencies = [ "console", "lazy_static", @@ -4362,7 +4501,7 @@ dependencies = [ "kube-core", "pem", "rand", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pemfile 2.2.0", "secrecy", "serde", @@ -4404,7 +4543,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4446,9 +4585,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libc-print" @@ -4461,9 +4600,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -4487,6 +4626,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -4784,7 +4929,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5023,7 +5168,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5067,7 +5212,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5096,7 +5241,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5271,7 +5416,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5488,9 +5633,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -5655,7 +5800,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.85", + "syn 2.0.87", "walkdir", ] @@ -5693,9 +5838,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -5732,9 +5877,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "log", "once_cell", @@ -5889,7 +6034,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6007,9 +6152,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -6063,13 +6208,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6080,7 +6225,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6113,7 +6258,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6307,6 +6452,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -6344,7 +6495,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6381,9 +6532,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -6399,7 +6550,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6417,6 +6568,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -6467,9 +6629,9 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -6728,22 +6890,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6824,6 +6986,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -6841,9 +7013,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -6865,7 +7037,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6905,7 +7077,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pki-types", "tokio", ] @@ -7099,7 +7271,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7250,12 +7422,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" @@ -7312,9 +7478,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -7333,12 +7499,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -7419,7 +7597,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -7453,7 +7631,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7789,7 +7967,7 @@ dependencies = [ "regex-automata 0.4.8", "regex-syntax 0.8.5", "reqwest 0.11.27", - "reqwest 0.12.8", + "reqwest 0.12.9", "ripemd", "sec1", "semver", @@ -7801,7 +7979,7 @@ dependencies = [ "spki", "subtle", "syn 1.0.109", - "syn 2.0.85", + "syn 2.0.87", "tendermint 0.38.1", "tendermint-proto 0.38.1", "tendermint-proto 0.39.1", @@ -7818,6 +7996,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "yaml-rust2" version = "0.8.1" @@ -7829,6 +8019,30 @@ dependencies = [ "hashlink", ] +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -7847,7 +8061,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -7867,5 +8102,27 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index 07dc369ab..c856367ce 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -79,15 +79,29 @@ impl AbstractMultisig { #[cfg(feature = "daemon")] impl Abstract { pub fn update_admin_to_multisig( - &self, + &mut self, admin: String, members: Vec, + proposal_creator: &T::Sender, extra_contracts: impl IntoIterator>, ) -> Result<(), AbstractInterfaceError> { + self.multisig.cw3.set_sender(proposal_creator); + self.multisig.cw4.set_sender(proposal_creator); + + let chain = self.registry.environment().clone(); + + let proposal_creator_addr = self.multisig.cw3.environment().sender_addr(); + + assert!( + members + .iter() + .any(|member| member.addr == proposal_creator_addr.as_str()), + "proposal_creator must be in members list" + ); + self.multisig.upload_if_needed()?; self.multisig.instantiate(admin, members)?; - let chain = self.registry.environment().clone(); let cw3_flex_address = self.multisig.cw3.address()?; let contract_admin_upgrades = self @@ -106,10 +120,7 @@ impl Abstract { }) .collect::>(); chain - .commit_any::( - contract_admin_upgrades, - None, - ) + .commit_any(contract_admin_upgrades, None) .map_err(Into::into)?; log::info!("Updated migrate admin of abstract contracts"); @@ -223,106 +234,90 @@ impl Abstract { let mut has_uploaded = false; let mut msgs: Vec = vec![]; let mut natives_to_register = vec![]; - // cw3_flex_multisig::ExecuteMsg::Propose { - // title: "Migrate Abstract Deployment".to_owned(), - // description: (), - // msgs: (), - // latest: None, - // }; if ::module_factory::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.module_factory)?.version { - let uploading_result = self.module_factory.upload_if_needed()?; - if let Some(result) = uploading_result { - let new_code_id = result.uploaded_code_id()?; - has_uploaded = true; - natives_to_register.push(( - self.module_factory.as_instance(), - ::module_factory::contract::CONTRACT_VERSION.to_string(), - )); - msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: self.module_factory.addr_str()?, - new_code_id, - msg: to_json_binary(&module_factory::MigrateMsg::Migrate {})?, - })); - } + self.module_factory.upload_if_needed()?; + let new_code_id = self.module_factory.code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.module_factory.as_instance(), + ::module_factory::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.module_factory.addr_str()?, + new_code_id, + msg: to_json_binary(&module_factory::MigrateMsg::Migrate {})?, + })); } if ::registry::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.registry)?.version { - let uploading_result = self.registry.upload_if_needed()?; - if let Some(result) = uploading_result { - let new_code_id = result.uploaded_code_id()?; - has_uploaded = true; - natives_to_register.push(( - self.registry.as_instance(), - ::registry::contract::CONTRACT_VERSION.to_string(), - )); - msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: self.registry.addr_str()?, - new_code_id, - msg: to_json_binary(®istry::MigrateMsg::Migrate {})?, - })); - } + self.registry.upload_if_needed()?; + let new_code_id = self.registry.code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.registry.as_instance(), + ::registry::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.registry.addr_str()?, + new_code_id, + msg: to_json_binary(®istry::MigrateMsg::Migrate {})?, + })); } if ::ans_host::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.ans_host)?.version { - let uploading_result = self.ans_host.upload_if_needed()?; - if let Some(result) = uploading_result { - let new_code_id = result.uploaded_code_id()?; - has_uploaded = true; - natives_to_register.push(( - self.ans_host.as_instance(), - ::ans_host::contract::CONTRACT_VERSION.to_string(), - )); - msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: self.ans_host.addr_str()?, - new_code_id, - msg: to_json_binary(&ans_host::MigrateMsg::Migrate {})?, - })); - } + self.ans_host.upload_if_needed()?; + let new_code_id = self.ans_host.code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ans_host.as_instance(), + ::ans_host::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ans_host.addr_str()?, + new_code_id, + msg: to_json_binary(&ans_host::MigrateMsg::Migrate {})?, + })); } // TODO: reimplement desired logic here after #531 merged if ::ibc_client::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.ibc.client)?.version { - let uploading_result = self.ibc.client.upload_if_needed()?; - if let Some(result) = uploading_result { - let new_code_id = result.uploaded_code_id()?; - has_uploaded = true; - natives_to_register.push(( - self.ibc.client.as_instance(), - ::ibc_client::contract::CONTRACT_VERSION.to_string(), - )); - msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: self.ibc.client.addr_str()?, - new_code_id, - msg: to_json_binary(&ibc_client::MigrateMsg::Migrate {})?, - })); - } + self.ibc.client.upload_if_needed()?; + let new_code_id = self.ibc.client.code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ibc.client.as_instance(), + ::ibc_client::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ibc.client.addr_str()?, + new_code_id, + msg: to_json_binary(&ibc_client::MigrateMsg {})?, + })); } if ::ibc_host::contract::CONTRACT_VERSION != crate::migrate::contract_version(&self.ibc.host)?.version { - let uploading_result = self.ibc.host.upload_if_needed()?; - if let Some(result) = uploading_result { - let new_code_id = result.uploaded_code_id()?; - has_uploaded = true; - natives_to_register.push(( - self.ibc.host.as_instance(), - ::ibc_host::contract::CONTRACT_VERSION.to_string(), - )); - msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { - contract_addr: self.ibc.host.addr_str()?, - new_code_id, - msg: to_json_binary(&ibc_host::MigrateMsg::Migrate {})?, - })); - } + self.ibc.host.upload_if_needed()?; + let new_code_id = self.ibc.host.code_id()?; + has_uploaded = true; + natives_to_register.push(( + self.ibc.host.as_instance(), + ::ibc_host::contract::CONTRACT_VERSION.to_string(), + )); + msgs.push(CosmosMsg::Wasm(WasmMsg::Migrate { + contract_addr: self.ibc.host.addr_str()?, + new_code_id, + msg: to_json_binary(&ibc_host::MigrateMsg {})?, + })); } let mut modules_to_register = self @@ -345,31 +340,40 @@ impl Abstract { has_uploaded = true } - msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, - msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { - modules: modules_to_register.clone(), - })?, - funds: vec![], - })); - msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, - msg: to_json_binary(®istry::ExecuteMsg::ApproveOrRejectModules { - approves: modules_to_register - .into_iter() - .map(|(info, _reference)| info) - .collect(), - rejects: vec![], - })?, - funds: vec![], - })); - let title = "Migrate native contracts of the abstract".to_owned(); let description = "We should upgrade abstract contracts to a new versions".to_owned(); self.multisig .cw3 .propose(description, msgs, title, None, &[])?; + let msgs = vec![ + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { + modules: modules_to_register.clone(), + })?, + funds: vec![], + }), + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::ApproveOrRejectModules { + approves: modules_to_register + .into_iter() + .map(|(info, _reference)| info) + .collect(), + rejects: vec![], + })?, + funds: vec![], + }), + ]; + + let title = "Register abstract modules in the abstract".to_owned(); + let description = + "We should register upgraded modules in the abstract contracts under a new version" + .to_owned(); + self.multisig + .cw3 + .propose(description, msgs, title, None, &[])?; Ok(has_uploaded) } } diff --git a/interchain/scripts/src/bin/propose_migrate.rs b/interchain/scripts/src/bin/propose_migrate.rs new file mode 100644 index 000000000..b202f7c45 --- /dev/null +++ b/interchain/scripts/src/bin/propose_migrate.rs @@ -0,0 +1,58 @@ +use abstract_interface::Abstract; +use clap::Parser; +use cw_orch::prelude::{ + networks::{parse_network, ChainInfo}, + *, +}; +use tokio::runtime::Runtime; + +pub const ABSTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +fn migrate(networks: Vec) -> anyhow::Result<()> { + let rt = Runtime::new()?; + for network in networks { + let chain = DaemonBuilder::new(network).handle(rt.handle()).build()?; + + let deployment = Abstract::load_from(chain.clone())?; + + deployment.propose_migrate_if_version_changed()?; + } + + Ok(()) +} + +#[derive(Parser, Default, Debug)] +#[command(author, version, about, long_about = None)] +struct Arguments { + /// Network Id to deploy on + #[arg(short, long, value_delimiter = ' ', num_args = 1..)] + network_ids: Vec, +} + +fn main() { + dotenv().ok(); + env_logger::init(); + use dotenv::dotenv; + let args = Arguments::parse(); + + let networks = args + .network_ids + .iter() + .map(|n| parse_network(n).unwrap()) + .collect::>(); + + if let Err(ref err) = migrate(networks) { + log::error!("{}", err); + err.chain() + .skip(1) + .for_each(|cause| log::error!("because: {}", cause)); + + // The backtrace is not always generated. Try to run this example + // with `$env:RUST_BACKTRACE=1`. + // if let Some(backtrace) = e.backtrace() { + // log::debug!("backtrace: {:?}", backtrace); + // } + + ::std::process::exit(1); + } +} diff --git a/interchain/scripts/src/bin/update_to_multisig.rs b/interchain/scripts/src/bin/update_to_multisig.rs index eee6c0853..504826c5a 100644 --- a/interchain/scripts/src/bin/update_to_multisig.rs +++ b/interchain/scripts/src/bin/update_to_multisig.rs @@ -1,5 +1,8 @@ +use std::sync::Arc; + use abstract_interface::Abstract; use cw_orch::prelude::*; +use cw_orch_daemon::{CosmosOptions, Wallet}; use networks::LOCAL_JUNO; fn main() -> anyhow::Result<()> { @@ -7,17 +10,31 @@ fn main() -> anyhow::Result<()> { env_logger::init(); use dotenv::dotenv; + let abstract_mnemonic = + std::env::var("ABSTRACT_MNEMONIC").expect("Fill your abstract mnemonic"); // Fill members - let members = vec![]; + let members = vec![cw4::Member { + addr: "juno14cl2dthqamgucg9sfvv4relp3aa83e40rg8jrz".to_string(), + weight: 1, + }]; assert!(!members.is_empty(), "Fill multisig members first"); // Change network let network = LOCAL_JUNO; let chain = DaemonBuilder::new(network).build()?; - let deployment = Abstract::load_from(chain.clone())?; + let proposal_creator = chain.rt_handle.block_on(Wallet::new( + &Arc::new(chain.chain_info().clone()), + CosmosOptions::default().mnemonic(abstract_mnemonic), + ))?; - deployment.update_admin_to_multisig(chain.sender_addr().to_string(), members, [])?; + let mut deployment = Abstract::load_from(chain.clone())?; + deployment.update_admin_to_multisig( + chain.sender_addr().to_string(), + members, + &proposal_creator, + [], + )?; Ok(()) } From 4cc4eb488f009e1ab7f77f1a96f7f9a5e1e88b27 Mon Sep 17 00:00:00 2001 From: Buckram Date: Mon, 11 Nov 2024 11:55:14 +0200 Subject: [PATCH 08/10] fixes --- .../abstract-interface/src/multisig.rs | 26 ++++++++++--------- interchain/Cargo.toml | 1 + interchain/scripts/Cargo.toml | 1 + .../scripts/src/bin/update_to_multisig.rs | 5 +--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index c856367ce..b1f5b6c96 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -10,7 +10,7 @@ use abstract_std::{ module_reference::ModuleReference, ABSTRACT_ACCOUNT_ID, }, - registry::{self, ExecuteMsgFns as _}, + registry::{self, ExecuteMsgFns as _, QueryMsgFns}, ACCOUNT, }; use cosmwasm_std::{to_json_binary, CosmosMsg, WasmMsg}; @@ -346,15 +346,17 @@ impl Abstract { .cw3 .propose(description, msgs, title, None, &[])?; - let msgs = vec![ - CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, - msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { - modules: modules_to_register.clone(), - })?, - funds: vec![], - }), - CosmosMsg::Wasm(WasmMsg::Execute { + let mut msgs = vec![CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: self.registry.addr_str()?, + msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { + modules: modules_to_register.clone(), + })?, + funds: vec![], + })]; + // When security enabled we need to register it + let registry_config = self.registry.config()?; + if !registry_config.security_disabled { + msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: self.registry.addr_str()?, msg: to_json_binary(®istry::ExecuteMsg::ApproveOrRejectModules { approves: modules_to_register @@ -364,8 +366,8 @@ impl Abstract { rejects: vec![], })?, funds: vec![], - }), - ]; + })); + } let title = "Register abstract modules in the abstract".to_owned(); let description = diff --git a/interchain/Cargo.toml b/interchain/Cargo.toml index 58c800687..78ff37a27 100644 --- a/interchain/Cargo.toml +++ b/interchain/Cargo.toml @@ -62,6 +62,7 @@ cw-orch-daemon = { version = "0.28.0" } cw-orch-interchain = { version = "0.8.0" } cw-orch-clone-testing = { version = "0.9.0" } cw-orch-proto = { version = "0.9.0" } +cw-plus-orch = { version = "0.25.0" } # Keep these as path, creates cirular dependency otherwise # Only need to re-publish all contracts if a re-publish of abstract-interface is required diff --git a/interchain/scripts/Cargo.toml b/interchain/scripts/Cargo.toml index 0db459d29..afeb1dcb0 100644 --- a/interchain/scripts/Cargo.toml +++ b/interchain/scripts/Cargo.toml @@ -19,6 +19,7 @@ cw-orch = { workspace = true, features = ["daemon"] } cw-orch-interchain = { workspace = true, features = ["daemon"] } cw-orch-clone-testing = { workspace = true } cw-orch-polytone = { workspace = true } +cw-plus-orch = { workspace = true } abstract-std = { workspace = true } abstract-xion = { workspace = true } abstract-interface = { workspace = true, features = ["daemon"] } diff --git a/interchain/scripts/src/bin/update_to_multisig.rs b/interchain/scripts/src/bin/update_to_multisig.rs index 504826c5a..0f76a140d 100644 --- a/interchain/scripts/src/bin/update_to_multisig.rs +++ b/interchain/scripts/src/bin/update_to_multisig.rs @@ -13,10 +13,7 @@ fn main() -> anyhow::Result<()> { let abstract_mnemonic = std::env::var("ABSTRACT_MNEMONIC").expect("Fill your abstract mnemonic"); // Fill members - let members = vec![cw4::Member { - addr: "juno14cl2dthqamgucg9sfvv4relp3aa83e40rg8jrz".to_string(), - weight: 1, - }]; + let members = vec![]; assert!(!members.is_empty(), "Fill multisig members first"); // Change network From f4fa79824476ea585b436b4dff3513cf2b3904f6 Mon Sep 17 00:00:00 2001 From: Buckram Date: Mon, 11 Nov 2024 18:27:53 +0200 Subject: [PATCH 09/10] feature flag and some more helpers and small template --- .../packages/abstract-interface/Cargo.toml | 17 ++- .../abstract-interface/src/deployment.rs | 20 +-- .../packages/abstract-interface/src/lib.rs | 1 + .../abstract-interface/src/multisig.rs | 118 ++++++++++++++---- interchain/scripts/Cargo.toml | 2 +- ...l_template.rs => gov_proposal_template.rs} | 0 .../src/bin/multisig_proposal_template.rs | 81 ++++++++++++ ...migrate.rs => multisig_propose_migrate.rs} | 2 + .../scripts/src/bin/update_to_multisig.rs | 5 +- 9 files changed, 206 insertions(+), 40 deletions(-) rename interchain/scripts/src/bin/{proposal_template.rs => gov_proposal_template.rs} (100%) create mode 100644 interchain/scripts/src/bin/multisig_proposal_template.rs rename interchain/scripts/src/bin/{propose_migrate.rs => multisig_propose_migrate.rs} (94%) diff --git a/framework/packages/abstract-interface/Cargo.toml b/framework/packages/abstract-interface/Cargo.toml index 3b51596b4..fb1a85a48 100644 --- a/framework/packages/abstract-interface/Cargo.toml +++ b/framework/packages/abstract-interface/Cargo.toml @@ -22,6 +22,13 @@ default = ["integration"] daemon = ["cw-orch/daemon"] integration = [] interchain = ["dep:cw-orch-interchain", "dep:cw-orch-polytone"] +multisig = [ + "dep:cw-plus-orch", + "dep:cw-utils", + "dep:cw3", + "dep:cw4", + "dep:cw-ownable", +] [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cosmwasm-std = { workspace = true } @@ -64,11 +71,11 @@ prost-types = { version = "0.13.3" } prost = { version = "0.13.3" } # Multisig -cw-plus-orch = "0.25.0" -cw-utils = "2.0.0" -cw3 = "2.0.0" -cw4 = "2.0.0" -cw-ownable = { workspace = true } +cw-plus-orch = { version = "0.25.0", optional = true } +cw-utils = { version = "2.0.0", optional = true } +cw3 = { version = "2.0.0", optional = true } +cw4 = { version = "2.0.0", optional = true } +cw-ownable = { workspace = true, optional = true } [build-dependencies] serde_json = "1.0.79" diff --git a/framework/packages/abstract-interface/src/deployment.rs b/framework/packages/abstract-interface/src/deployment.rs index 4cbdf9f4e..4463ae2ca 100644 --- a/framework/packages/abstract-interface/src/deployment.rs +++ b/framework/packages/abstract-interface/src/deployment.rs @@ -5,9 +5,11 @@ use cw_orch::daemon::DeployedChains; use cw_orch::{mock::MockBase, prelude::*}; +#[cfg(feature = "multisig")] +use crate::multisig::AbstractMultisig; use crate::{ - get_ibc_contracts, get_native_contracts, multisig::AbstractMultisig, AbstractIbc, - AbstractInterfaceError, AccountI, AnsHost, ModuleFactory, Registry, + get_ibc_contracts, get_native_contracts, AbstractIbc, AbstractInterfaceError, AccountI, + AnsHost, ModuleFactory, Registry, }; use abstract_std::{native_addrs, ACCOUNT, ANS_HOST, MODULE_FACTORY, REGISTRY}; @@ -21,6 +23,7 @@ pub struct Abstract { pub ibc: AbstractIbc, pub(crate) account: AccountI, pub(crate) blob: CwBlob, + #[cfg(feature = "multisig")] pub multisig: AbstractMultisig, } @@ -39,8 +42,6 @@ impl Deploy for Abstract { let ibc_infra = AbstractIbc::new(&chain); - let multisig = AbstractMultisig::new(&chain); - blob.upload_if_needed()?; ans_host.upload()?; registry.upload()?; @@ -55,7 +56,8 @@ impl Deploy for Abstract { account, ibc: ibc_infra, blob, - multisig, + #[cfg(feature = "multisig")] + multisig: AbstractMultisig::new(&chain), }; Ok(deployment) @@ -206,7 +208,6 @@ impl Abstract { let (ans_host, registry, module_factory) = get_native_contracts(chain.clone()); let (ibc_client, ibc_host) = get_ibc_contracts(chain.clone()); let account = AccountI::new(ACCOUNT, chain.clone()); - let multisig = AbstractMultisig::new(&chain); Self { account, ans_host, @@ -216,7 +217,8 @@ impl Abstract { client: ibc_client, host: ibc_host, }, - multisig, + #[cfg(feature = "multisig")] + multisig: AbstractMultisig::new(&chain), blob: CwBlob::new(CW_BLOB, chain), } } @@ -293,7 +295,8 @@ impl Abstract { ibc, account, blob: _, - multisig: _, + #[cfg(feature = "multisig")] + multisig: _, } = self; ans_host.set_sender(sender); registry.set_sender(sender); @@ -311,6 +314,7 @@ impl Abstract { ibc: self.ibc.call_as(sender), account: self.account.call_as(sender), blob: self.blob.clone(), + #[cfg(feature = "multisig")] multisig: self.multisig.clone(), } } diff --git a/framework/packages/abstract-interface/src/lib.rs b/framework/packages/abstract-interface/src/lib.rs index 480d27759..65c86b850 100644 --- a/framework/packages/abstract-interface/src/lib.rs +++ b/framework/packages/abstract-interface/src/lib.rs @@ -29,4 +29,5 @@ pub use crate::{deployers::*, deployment::*}; pub use daemon_state::AbstractDaemonState; +#[cfg(feature = "multisig")] pub mod multisig; diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index b1f5b6c96..e30414fed 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -21,7 +21,7 @@ use cw_plus_orch::{ }; use prost::{Message, Name}; -use crate::{Abstract, AbstractInterfaceError, AccountI}; +use crate::{Abstract, AbstractInterfaceError, AccountI, AnsHost, ModuleFactory, Registry}; pub const CW3_ABSTRACT: &str = "cw3:abstract"; pub const CW4_ABSTRACT: &str = "cw4:abstract"; @@ -74,6 +74,93 @@ impl AbstractMultisig { Ok(()) } + + pub fn propose_on_registry_msgs( + &self, + registry: &Registry, + msgs: Vec, + ) -> Result, AbstractInterfaceError> { + let registry = registry.addr_str()?; + msgs.into_iter() + .map(|msg| { + Ok(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: registry.clone(), + msg: to_json_binary(&msg)?, + funds: vec![], + })) + }) + .collect() + } + + pub fn propose_on_ans_msgs( + &self, + ans: &AnsHost, + msgs: Vec, + ) -> Result, AbstractInterfaceError> { + let ans_host = ans.addr_str()?; + msgs.into_iter() + .map(|msg| { + Ok(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: ans_host.clone(), + msg: to_json_binary(&msg)?, + funds: vec![], + })) + }) + .collect() + } + + pub fn propose_on_ibc_client_msgs( + &self, + ibc_client: &ModuleFactory, + msgs: Vec, + ) -> Result, AbstractInterfaceError> { + let ibc_client = ibc_client.addr_str()?; + msgs.into_iter() + .map(|msg| { + Ok(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: ibc_client.clone(), + msg: to_json_binary(&msg)?, + funds: vec![], + })) + }) + .collect() + } + + pub fn propose_on_ibc_host_msgs( + &self, + ibc_host: &ModuleFactory, + msgs: Vec, + ) -> Result, AbstractInterfaceError> { + let ibc_host = ibc_host.addr_str()?; + msgs.into_iter() + .map(|msg| { + Ok(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: ibc_host.clone(), + msg: to_json_binary(&msg)?, + funds: vec![], + })) + }) + .collect() + } + + /// Create messages for new modules + pub fn propose_modules_msgs( + &self, + registry: &Registry, + modules: Vec<(ModuleInfo, ModuleReference)>, + ) -> Result, AbstractInterfaceError> { + let mut msgs = vec![registry::ExecuteMsg::ProposeModules { + modules: modules.clone(), + }]; + let registry_config = registry.config()?; + if !registry_config.security_disabled { + msgs.push(registry::ExecuteMsg::ApproveOrRejectModules { + approves: modules.into_iter().map(|(info, _reference)| info).collect(), + rejects: vec![], + }); + } + self.propose_on_registry_msgs(registry, msgs) + } } #[cfg(feature = "daemon")] @@ -346,36 +433,17 @@ impl Abstract { .cw3 .propose(description, msgs, title, None, &[])?; - let mut msgs = vec![CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, - msg: to_json_binary(®istry::ExecuteMsg::ProposeModules { - modules: modules_to_register.clone(), - })?, - funds: vec![], - })]; - // When security enabled we need to register it - let registry_config = self.registry.config()?; - if !registry_config.security_disabled { - msgs.push(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: self.registry.addr_str()?, - msg: to_json_binary(®istry::ExecuteMsg::ApproveOrRejectModules { - approves: modules_to_register - .into_iter() - .map(|(info, _reference)| info) - .collect(), - rejects: vec![], - })?, - funds: vec![], - })); - } + let propose_modules_msgs = self + .multisig + .propose_modules_msgs(&self.registry, modules_to_register)?; - let title = "Register abstract modules in the abstract".to_owned(); + let title = "Register abstract native modules in the abstract".to_owned(); let description = "We should register upgraded modules in the abstract contracts under a new version" .to_owned(); self.multisig .cw3 - .propose(description, msgs, title, None, &[])?; + .propose(description, propose_modules_msgs, title, None, &[])?; Ok(has_uploaded) } } diff --git a/interchain/scripts/Cargo.toml b/interchain/scripts/Cargo.toml index afeb1dcb0..23728a1c7 100644 --- a/interchain/scripts/Cargo.toml +++ b/interchain/scripts/Cargo.toml @@ -22,7 +22,7 @@ cw-orch-polytone = { workspace = true } cw-plus-orch = { workspace = true } abstract-std = { workspace = true } abstract-xion = { workspace = true } -abstract-interface = { workspace = true, features = ["daemon"] } +abstract-interface = { workspace = true, features = ["daemon", "multisig"] } tokio = { workspace = true, features = ["full"] } log = "0.4.14" anyhow = { workspace = true } diff --git a/interchain/scripts/src/bin/proposal_template.rs b/interchain/scripts/src/bin/gov_proposal_template.rs similarity index 100% rename from interchain/scripts/src/bin/proposal_template.rs rename to interchain/scripts/src/bin/gov_proposal_template.rs diff --git a/interchain/scripts/src/bin/multisig_proposal_template.rs b/interchain/scripts/src/bin/multisig_proposal_template.rs new file mode 100644 index 000000000..c5e94314a --- /dev/null +++ b/interchain/scripts/src/bin/multisig_proposal_template.rs @@ -0,0 +1,81 @@ +//! Template to create proposal as abstract multisig + +use abstract_interface::Abstract; +use clap::Parser; +use cw_orch::prelude::{ + networks::{parse_network, ChainInfo}, + *, +}; +use cw_plus_orch::cw3_flex_multisig::ExecuteMsgInterfaceFns; +use tokio::runtime::Runtime; + +pub const ABSTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +#[allow(unused)] +fn migrate(networks: Vec) -> anyhow::Result<()> { + let rt = Runtime::new()?; + for network in networks { + let chain = DaemonBuilder::new(network).handle(rt.handle()).build()?; + + let deployment = Abstract::load_from(chain.clone())?; + + let mut msgs = vec![]; + + // Example of abstract action + msgs.extend(deployment.multisig.propose_on_ans_msgs( + &deployment.ans_host, + vec![abstract_std::ans_host::ExecuteMsg::UpdateAssetAddresses { + to_add: vec![], + to_remove: vec![], + }], + )?); + + msgs.push(todo!()); + + let title: &str = todo!(); + let description: &str = todo!(); + let latest = None; + deployment + .multisig + .cw3 + .propose(description, msgs, title, latest, &[])?; + } + + Ok(()) +} + +#[derive(Parser, Default, Debug)] +#[command(author, version, about, long_about = None)] +struct Arguments { + /// Network Id to deploy on + #[arg(short, long, value_delimiter = ' ', num_args = 1..)] + network_ids: Vec, +} + +fn main() { + dotenv().ok(); + env_logger::init(); + use dotenv::dotenv; + let args = Arguments::parse(); + + let networks = args + .network_ids + .iter() + .map(|n| parse_network(n).unwrap()) + .collect::>(); + + if let Err(ref err) = migrate(networks) { + log::error!("{}", err); + err.chain() + .skip(1) + .for_each(|cause| log::error!("because: {}", cause)); + + // The backtrace is not always generated. Try to run this example + // with `$env:RUST_BACKTRACE=1`. + // if let Some(backtrace) = e.backtrace() { + // log::debug!("backtrace: {:?}", backtrace); + // } + + ::std::process::exit(1); + } +} diff --git a/interchain/scripts/src/bin/propose_migrate.rs b/interchain/scripts/src/bin/multisig_propose_migrate.rs similarity index 94% rename from interchain/scripts/src/bin/propose_migrate.rs rename to interchain/scripts/src/bin/multisig_propose_migrate.rs index b202f7c45..c8c8a39aa 100644 --- a/interchain/scripts/src/bin/propose_migrate.rs +++ b/interchain/scripts/src/bin/multisig_propose_migrate.rs @@ -1,3 +1,5 @@ +//! This script creates proposal to migrate contracts and register them in the registry + use abstract_interface::Abstract; use clap::Parser; use cw_orch::prelude::{ diff --git a/interchain/scripts/src/bin/update_to_multisig.rs b/interchain/scripts/src/bin/update_to_multisig.rs index 0f76a140d..3d8f1d318 100644 --- a/interchain/scripts/src/bin/update_to_multisig.rs +++ b/interchain/scripts/src/bin/update_to_multisig.rs @@ -1,3 +1,6 @@ +//! This script moves ownership of the abstract to the newly-created multisig +//! You need to fill members and network to run it correctly + use std::sync::Arc; use abstract_interface::Abstract; @@ -11,7 +14,7 @@ fn main() -> anyhow::Result<()> { use dotenv::dotenv; let abstract_mnemonic = - std::env::var("ABSTRACT_MNEMONIC").expect("Fill your abstract mnemonic"); + std::env::var("MULTISIG_MNEMONIC").expect("Fill your abstract mnemonic"); // Fill members let members = vec![]; assert!(!members.is_empty(), "Fill multisig members first"); From 2736c99bc4ce179d00999a754421c5431a85bf71 Mon Sep 17 00:00:00 2001 From: Buckram Date: Mon, 11 Nov 2024 18:30:00 +0200 Subject: [PATCH 10/10] clippy and hakari --- framework/Cargo.lock | 3 ++- .../abstract-interface/src/multisig.rs | 2 +- framework/workspace-hack/Cargo.toml | 24 +++++++++++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/framework/Cargo.lock b/framework/Cargo.lock index 64e515175..a400e8c2a 100644 --- a/framework/Cargo.lock +++ b/framework/Cargo.lock @@ -7907,7 +7907,8 @@ dependencies = [ "chrono", "console", "cosmos-sdk-proto 0.24.0", - "cosmrs 0.19.0", + "cosmos-sdk-proto 0.25.0", + "cosmrs 0.20.0", "cosmwasm-std", "crossbeam-epoch", "crunchy", diff --git a/framework/packages/abstract-interface/src/multisig.rs b/framework/packages/abstract-interface/src/multisig.rs index e30414fed..7dac44be4 100644 --- a/framework/packages/abstract-interface/src/multisig.rs +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -284,7 +284,7 @@ impl Abstract { log::info!("Created proposal to update ownerships of abstract contracts"); // Move ownership of the account - let root_account = AccountI::load_from(&self, ABSTRACT_ACCOUNT_ID)?; + let root_account = AccountI::load_from(self, ABSTRACT_ACCOUNT_ID)?; root_account.update_ownership(GovAction::TransferOwnership { new_owner: GovernanceDetails::External { governance_address: cw3_flex_address.to_string(), diff --git a/framework/workspace-hack/Cargo.toml b/framework/workspace-hack/Cargo.toml index dbed3317a..97a9b78cd 100644 --- a/framework/workspace-hack/Cargo.toml +++ b/framework/workspace-hack/Cargo.toml @@ -85,8 +85,9 @@ byteorder = { version = "1", features = ["i128"] } bytes = { version = "1" } chrono = { version = "0.4", features = ["serde"] } console = { version = "0.15" } -cosmos-sdk-proto = { version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } -cosmrs = { version = "0.19", features = ["cosmwasm", "dev", "grpc"] } +cosmos-sdk-proto-2ffb4c3fe830441c = { package = "cosmos-sdk-proto", version = "0.25", default-features = false, features = ["cosmwasm", "std"] } +cosmos-sdk-proto-adf3d7031871b0af = { package = "cosmos-sdk-proto", version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } +cosmrs = { version = "0.20", features = ["cosmwasm"] } crossbeam-epoch = { version = "0.9" } crunchy = { version = "0.2", features = ["std"] } cw-orch-interchain-core = { version = "0.9", default-features = false, features = ["daemon"] } @@ -161,8 +162,9 @@ byteorder = { version = "1", features = ["i128"] } bytes = { version = "1" } chrono = { version = "0.4", features = ["serde"] } console = { version = "0.15" } -cosmos-sdk-proto = { version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } -cosmrs = { version = "0.19", features = ["cosmwasm", "dev", "grpc"] } +cosmos-sdk-proto-2ffb4c3fe830441c = { package = "cosmos-sdk-proto", version = "0.25", default-features = false, features = ["cosmwasm", "std"] } +cosmos-sdk-proto-adf3d7031871b0af = { package = "cosmos-sdk-proto", version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } +cosmrs = { version = "0.20", features = ["cosmwasm"] } crossbeam-epoch = { version = "0.9" } crunchy = { version = "0.2", features = ["std"] } cw-orch-interchain-core = { version = "0.9", default-features = false, features = ["daemon"] } @@ -214,7 +216,7 @@ serde_json = { version = "1", features = ["alloc", "raw_value"] } signature = { version = "2", default-features = false, features = ["digest", "rand_core", "std"] } smallvec = { version = "1", default-features = false, features = ["const_new"] } spki = { version = "0.7", default-features = false, features = ["pem", "std"] } -syn-f595c2ba2a3f28df = { package = "syn", version = "2", default-features = false, features = ["visit"] } +syn-f595c2ba2a3f28df = { package = "syn", version = "2", default-features = false, features = ["fold", "visit"] } tendermint = { version = "0.38", features = ["secp256k1"] } time = { version = "0.3", features = ["macros", "parsing"] } tiny-keccak = { version = "2", features = ["keccak"] } @@ -238,8 +240,9 @@ byteorder = { version = "1", features = ["i128"] } bytes = { version = "1" } chrono = { version = "0.4", features = ["serde"] } console = { version = "0.15" } -cosmos-sdk-proto = { version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } -cosmrs = { version = "0.19", features = ["cosmwasm", "dev", "grpc"] } +cosmos-sdk-proto-2ffb4c3fe830441c = { package = "cosmos-sdk-proto", version = "0.25", default-features = false, features = ["cosmwasm", "std"] } +cosmos-sdk-proto-adf3d7031871b0af = { package = "cosmos-sdk-proto", version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } +cosmrs = { version = "0.20", features = ["cosmwasm"] } crossbeam-epoch = { version = "0.9" } crunchy = { version = "0.2", features = ["std"] } cw-orch-interchain-core = { version = "0.9", default-features = false, features = ["daemon"] } @@ -313,8 +316,9 @@ byteorder = { version = "1", features = ["i128"] } bytes = { version = "1" } chrono = { version = "0.4", features = ["serde"] } console = { version = "0.15" } -cosmos-sdk-proto = { version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } -cosmrs = { version = "0.19", features = ["cosmwasm", "dev", "grpc"] } +cosmos-sdk-proto-2ffb4c3fe830441c = { package = "cosmos-sdk-proto", version = "0.25", default-features = false, features = ["cosmwasm", "std"] } +cosmos-sdk-proto-adf3d7031871b0af = { package = "cosmos-sdk-proto", version = "0.24", default-features = false, features = ["cosmwasm", "grpc-transport"] } +cosmrs = { version = "0.20", features = ["cosmwasm"] } crossbeam-epoch = { version = "0.9" } crunchy = { version = "0.2", features = ["std"] } cw-orch-interchain-core = { version = "0.9", default-features = false, features = ["daemon"] } @@ -366,7 +370,7 @@ serde_json = { version = "1", features = ["alloc", "raw_value"] } signature = { version = "2", default-features = false, features = ["digest", "rand_core", "std"] } smallvec = { version = "1", default-features = false, features = ["const_new"] } spki = { version = "0.7", default-features = false, features = ["pem", "std"] } -syn-f595c2ba2a3f28df = { package = "syn", version = "2", default-features = false, features = ["visit"] } +syn-f595c2ba2a3f28df = { package = "syn", version = "2", default-features = false, features = ["fold", "visit"] } tendermint = { version = "0.38", features = ["secp256k1"] } time = { version = "0.3", features = ["macros", "parsing"] } tiny-keccak = { version = "2", features = ["keccak"] }