diff --git a/framework/Cargo.lock b/framework/Cargo.lock index 207b1bc58..a400e8c2a 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", @@ -375,7 +374,7 @@ dependencies = [ "abstract-sdk", "abstract-std", "abstract-testing", - "cosmrs 0.19.0", + "cosmrs 0.20.0", "cosmwasm-schema", "cosmwasm-std", "coverage-helper", @@ -385,12 +384,19 @@ dependencies = [ "cw-controllers", "cw-orch 0.27.0", "cw-orch-interchain", + "cw-ownable", + "cw-plus-orch", "cw-storage-plus", + "cw-utils", "cw2", "cw20", + "cw3", + "cw4", "dotenv", "env_logger", "log", + "prost", + "prost-types", "rust-embed", "schemars", "semver", @@ -681,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", @@ -794,7 +800,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -810,7 +816,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", "tiny-keccak", ] @@ -826,7 +832,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "syn-solidity", ] @@ -858,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", @@ -873,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" @@ -913,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" @@ -1082,7 +1088,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1104,7 +1110,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1115,7 +1121,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1373,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", @@ -1405,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" @@ -1550,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", ] @@ -1609,7 +1615,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1835,7 +1841,7 @@ checksum = "1b5658b1dc64e10b56ae7a449f678f96932a96f6cfad1769d608d1d1d656480a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1859,7 +1865,7 @@ checksum = "c8ef1b5835a65fcca3ab8b9a02b4f4dacc78e233a5c2f20b270efb9db0666d12" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1995,7 +2001,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2126,7 +2132,7 @@ checksum = "bad52865e313bb7ed3f3938f7ad9d566e430fb6143a63476c22bed505ea78cd7" dependencies = [ "convert_case 0.6.0", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2151,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", @@ -2161,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", @@ -2182,7 +2188,7 @@ dependencies = [ "prost", "prost-types", "rand_core", - "reqwest 0.12.8", + "reqwest 0.12.9", "ring", "ripemd", "schemars", @@ -2205,7 +2211,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2216,7 +2222,7 @@ checksum = "85806182382aef051a318b9abb41af559e6d7733fbba3c04c42ed23cc03d8e1a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2310,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", @@ -2348,7 +2354,7 @@ dependencies = [ "k8s-openapi", "kube", "log", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "thiserror", @@ -2724,7 +2730,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2746,7 +2752,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2844,7 +2850,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2864,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]] @@ -2877,7 +2883,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2897,7 +2903,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "unicode-xid", ] @@ -3005,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" @@ -3241,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" @@ -3410,7 +3427,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3574,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" @@ -3863,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", @@ -3873,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", @@ -3902,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", @@ -4117,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" @@ -4125,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]] @@ -4165,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]] @@ -4180,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", @@ -4355,7 +4501,7 @@ dependencies = [ "kube-core", "pem", "rand", - "rustls 0.23.15", + "rustls 0.23.16", "rustls-pemfile 2.2.0", "secrecy", "serde", @@ -4397,7 +4543,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4439,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" @@ -4454,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" @@ -4480,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" @@ -4777,7 +4929,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5016,7 +5168,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5060,7 +5212,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5089,7 +5241,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5264,7 +5416,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5481,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", @@ -5648,7 +5800,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.85", + "syn 2.0.87", "walkdir", ] @@ -5686,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", @@ -5725,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", @@ -5882,7 +6034,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6000,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", ] @@ -6056,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]] @@ -6073,7 +6225,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6106,7 +6258,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6300,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" @@ -6337,7 +6495,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6374,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", @@ -6392,7 +6550,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6410,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" @@ -6460,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", @@ -6721,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]] @@ -6817,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" @@ -6834,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", @@ -6858,7 +7037,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6898,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", ] @@ -7092,7 +7271,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7243,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" @@ -7305,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", @@ -7326,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" @@ -7412,7 +7597,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -7446,7 +7631,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7722,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", @@ -7782,7 +7968,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", @@ -7794,7 +7980,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", @@ -7811,6 +7997,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" @@ -7822,6 +8020,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" @@ -7840,7 +8062,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]] @@ -7860,5 +8103,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/Cargo.toml b/framework/packages/abstract-interface/Cargo.toml index 27ec43729..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 } @@ -59,7 +66,16 @@ 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" } + +# Multisig +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 6a90923d2..4463ae2ca 100644 --- a/framework/packages/abstract-interface/src/deployment.rs +++ b/framework/packages/abstract-interface/src/deployment.rs @@ -5,6 +5,8 @@ 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, AbstractIbc, AbstractInterfaceError, AccountI, AnsHost, ModuleFactory, Registry, @@ -21,6 +23,8 @@ pub struct Abstract { pub ibc: AbstractIbc, pub(crate) account: AccountI, pub(crate) blob: CwBlob, + #[cfg(feature = "multisig")] + pub multisig: AbstractMultisig, } impl Deploy for Abstract { @@ -52,6 +56,8 @@ impl Deploy for Abstract { account, ibc: ibc_infra, blob, + #[cfg(feature = "multisig")] + multisig: AbstractMultisig::new(&chain), }; Ok(deployment) @@ -211,6 +217,8 @@ impl Abstract { client: ibc_client, host: ibc_host, }, + #[cfg(feature = "multisig")] + multisig: AbstractMultisig::new(&chain), blob: CwBlob::new(CW_BLOB, chain), } } @@ -287,6 +295,8 @@ impl Abstract { ibc, account, blob: _, + #[cfg(feature = "multisig")] + multisig: _, } = self; ans_host.set_sender(sender); registry.set_sender(sender); @@ -304,6 +314,8 @@ 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/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..65c86b850 100644 --- a/framework/packages/abstract-interface/src/lib.rs +++ b/framework/packages/abstract-interface/src/lib.rs @@ -28,3 +28,6 @@ pub use error::AbstractInterfaceError; pub use crate::{deployers::*, deployment::*}; pub use daemon_state::AbstractDaemonState; + +#[cfg(feature = "multisig")] +pub mod multisig; diff --git a/framework/packages/abstract-interface/src/migrate.rs b/framework/packages/abstract-interface/src/migrate.rs index 5ef002ce4..de5972180 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 new file mode 100644 index 000000000..7dac44be4 --- /dev/null +++ b/framework/packages/abstract-interface/src/multisig.rs @@ -0,0 +1,449 @@ +use abstract_std::{ + account::{self, ExecuteMsgFns as _}, + ans_host::{self, ExecuteMsgFns as _}, + ibc_client::{self, ExecuteMsgFns as _}, + ibc_host::{self, ExecuteMsgFns as _}, + module_factory::{self, ExecuteMsgFns as _}, + objects::{ + gov_type::{GovAction, GovernanceDetails}, + module::ModuleInfo, + module_reference::ModuleReference, + ABSTRACT_ACCOUNT_ID, + }, + registry::{self, ExecuteMsgFns as _, QueryMsgFns}, + ACCOUNT, +}; +use cosmwasm_std::{to_json_binary, CosmosMsg, WasmMsg}; +use cw_orch::{contract::Contract, prelude::*}; +use cw_plus_orch::{ + cw3_flex_multisig::{self, Cw3FlexMultisig, ExecuteMsgInterfaceFns}, + cw4_group::{self, Cw4Group}, +}; +use prost::{Message, Name}; + +use crate::{Abstract, AbstractInterfaceError, AccountI, AnsHost, ModuleFactory, Registry}; + +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(51_u128, 100_u128), + }, + max_voting_period: cw_utils::WEEK, + executor: None, + proposal_deposit: None, + }, + Some(&contract_admin), + &[], + )?; + + 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")] +impl Abstract { + pub fn update_admin_to_multisig( + &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 cw3_flex_address = self.multisig.cw3.address()?; + + let contract_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(contract_admin_upgrades, None) + .map_err(Into::into)?; + log::info!("Updated migrate admin of abstract contracts"); + + 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.ans_host.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.module_factory.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.ibc.client.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.ibc.host.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 = "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, &[])?; + 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)?; + 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".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 { + contract_addr: root_account.addr_str()?, + msg: to_json_binary(&::UpdateOwnership( + GovAction::AcceptOwnership, + ))?, + funds: vec![], + })], + title, + None, + &[], + )?; + log::info!("Created proposal to update abstract root account governance"); + + 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![]; + + if ::module_factory::contract::CONTRACT_VERSION + != crate::migrate::contract_version(&self.module_factory)?.version + { + 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 + { + 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 + { + 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 + { + 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 + { + 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 + .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() + { + modules_to_register.push(( + ModuleInfo::from_id(ACCOUNT, ::account::contract::CONTRACT_VERSION.parse()?)?, + ModuleReference::Account(self.account.code_id()?), + )); + + has_uploaded = true + } + + 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 propose_modules_msgs = self + .multisig + .propose_modules_msgs(&self.registry, modules_to_register)?; + + 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, propose_modules_msgs, title, None, &[])?; + 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, 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"] } 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 405d2bdc2..23728a1c7 100644 --- a/interchain/scripts/Cargo.toml +++ b/interchain/scripts/Cargo.toml @@ -19,9 +19,10 @@ 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"] } +abstract-interface = { workspace = true, features = ["daemon", "multisig"] } tokio = { workspace = true, features = ["full"] } log = "0.4.14" anyhow = { workspace = true } @@ -64,4 +65,5 @@ prost = { version = "0.13" } prost-types = { version = "0.13" } cw-orch-core = "2.0.0" +cw4 = "2.0.0" cosmwasm-schema.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/multisig_propose_migrate.rs b/interchain/scripts/src/bin/multisig_propose_migrate.rs new file mode 100644 index 000000000..c8c8a39aa --- /dev/null +++ b/interchain/scripts/src/bin/multisig_propose_migrate.rs @@ -0,0 +1,60 @@ +//! This script creates proposal to migrate contracts and register them in the registry + +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 new file mode 100644 index 000000000..3d8f1d318 --- /dev/null +++ b/interchain/scripts/src/bin/update_to_multisig.rs @@ -0,0 +1,40 @@ +//! 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; +use cw_orch::prelude::*; +use cw_orch_daemon::{CosmosOptions, Wallet}; +use networks::LOCAL_JUNO; + +fn main() -> anyhow::Result<()> { + dotenv().ok(); + env_logger::init(); + use dotenv::dotenv; + + let 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"); + + // Change network + let network = LOCAL_JUNO; + + let chain = DaemonBuilder::new(network).build()?; + let proposal_creator = chain.rt_handle.block_on(Wallet::new( + &Arc::new(chain.chain_info().clone()), + CosmosOptions::default().mnemonic(abstract_mnemonic), + ))?; + + let mut deployment = Abstract::load_from(chain.clone())?; + deployment.update_admin_to_multisig( + chain.sender_addr().to_string(), + members, + &proposal_creator, + [], + )?; + + Ok(()) +}