diff --git a/CHANGELOG.md b/CHANGELOG.md index e8016097d..93c3c31b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ADODB now supports pre-release tagging [(#560)](https://github.com/andromedaprotocol/andromeda-core/pull/560) - Validator Staking: Updated according to audit [(#565)](https://github.com/andromedaprotocol/andromeda-core/pull/565) - Conditional Splitter: Change lock_time's type from MillisecondsDuration to Expiry [(#567)](https://github.com/andromedaprotocol/andromeda-core/pull/567) +- Permissions now have an optional start time [(#668)](https://github.com/andromedaprotocol/andromeda-core/pull/668) ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 150b9f879..900ea49aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -912,6 +912,7 @@ dependencies = [ "osmosis-std-derive 0.15.3", "prost 0.11.9", "regex", + "rstest", "schemars", "semver", "serde", @@ -1118,11 +1119,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -1140,7 +1142,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -1162,18 +1164,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] name = "async-trait" -version = "0.1.84" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1244b10dcd56c92219da4e14caa97e312079e185f04ba3eea25061561dc0a0" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -1348,9 +1350,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -1408,9 +1410,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.7" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "shlex", ] @@ -1678,7 +1680,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -1793,7 +1795,7 @@ checksum = "bad52865e313bb7ed3f3938f7ad9d566e430fb6143a63476c22bed505ea78cd7" dependencies = [ "convert_case", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -1818,9 +1820,9 @@ dependencies = [ [[package]] name = "cw-orch-daemon" -version = "0.24.5" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474651c5495b8644139a6978632ebe2e56f0e0fa3097b5e8b1bd7bd8128f8774" +checksum = "2e9f248dc0ebcadf6e1d0aaa4c520c2955ab74f9e4b5d71c8d6380bc1338c57c" dependencies = [ "anyhow", "async-recursion", @@ -2263,7 +2265,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -2316,7 +2318,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -2655,7 +2657,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -2753,7 +2755,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -2772,7 +2774,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.2.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -2978,7 +2980,7 @@ dependencies = [ "http 1.2.0", "hyper 1.5.2", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.21", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", @@ -3272,7 +3274,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -3323,9 +3325,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -3343,9 +3345,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is_terminal_polyfill" @@ -3397,9 +3399,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -3458,15 +3460,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -3510,9 +3512,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -3614,7 +3616,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -3684,7 +3686,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "foreign-types", "libc", @@ -3701,7 +3703,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -3839,29 +3841,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3934,9 +3936,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -3984,7 +3986,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4056,7 +4058,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -4254,7 +4256,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.94", + "syn 2.0.96", "unicode-ident", ] @@ -4275,11 +4277,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys", @@ -4300,9 +4302,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "once_cell", "rustls-pki-types", @@ -4419,7 +4421,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4477,7 +4479,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "core-foundation-sys", "libc", @@ -4486,9 +4488,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -4553,7 +4555,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4564,7 +4566,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4587,7 +4589,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4789,9 +4791,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.94" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -4821,7 +4823,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -4841,7 +4843,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "system-configuration-sys 0.6.0", ] @@ -5072,7 +5074,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -5083,7 +5085,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", "test-case-core", ] @@ -5165,7 +5167,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -5176,7 +5178,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -5266,7 +5268,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -5295,7 +5297,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.21", "tokio", ] @@ -5359,7 +5361,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -5491,7 +5493,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -5582,9 +5584,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" [[package]] name = "vcpkg" @@ -5631,34 +5633,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -5669,9 +5672,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5679,28 +5682,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5926,9 +5932,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.22" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] @@ -5975,7 +5981,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", "synstructure", ] @@ -5997,7 +6003,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -6017,7 +6023,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", "synstructure", ] @@ -6038,7 +6044,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] [[package]] @@ -6060,5 +6066,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.94", + "syn 2.0.96", ] diff --git a/contracts/accounts/andromeda-fixed-multisig/src/contract.rs b/contracts/accounts/andromeda-fixed-multisig/src/contract.rs index 0c02b1475..34e713e21 100644 --- a/contracts/accounts/andromeda-fixed-multisig/src/contract.rs +++ b/contracts/accounts/andromeda-fixed-multisig/src/contract.rs @@ -134,6 +134,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } diff --git a/contracts/app/andromeda-app-contract/src/contract.rs b/contracts/app/andromeda-app-contract/src/contract.rs index 49f3ef655..7524e39a8 100644 --- a/contracts/app/andromeda-app-contract/src/contract.rs +++ b/contracts/app/andromeda-app-contract/src/contract.rs @@ -197,8 +197,8 @@ pub fn handle_execute(ctx: ExecuteContext, msg: ExecuteMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/data-storage/andromeda-boolean/src/contract.rs b/contracts/data-storage/andromeda-boolean/src/contract.rs index 565ea7690..c41adb143 100644 --- a/contracts/data-storage/andromeda-boolean/src/contract.rs +++ b/contracts/data-storage/andromeda-boolean/src/contract.rs @@ -56,7 +56,7 @@ pub fn instantiate( None => info.sender, Some(owner) => Addr::unchecked(owner), }, - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } @@ -89,8 +89,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/data-storage/andromeda-form/src/contract.rs b/contracts/data-storage/andromeda-form/src/contract.rs index 8cb19e055..a8327f44d 100644 --- a/contracts/data-storage/andromeda-form/src/contract.rs +++ b/contracts/data-storage/andromeda-form/src/contract.rs @@ -112,7 +112,7 @@ pub fn instantiate( deps.storage, SUBMIT_FORM_ACTION, addr, - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } } @@ -164,8 +164,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/data-storage/andromeda-primitive/src/contract.rs b/contracts/data-storage/andromeda-primitive/src/contract.rs index 22683111f..ab2bd55ef 100644 --- a/contracts/data-storage/andromeda-primitive/src/contract.rs +++ b/contracts/data-storage/andromeda-primitive/src/contract.rs @@ -61,8 +61,8 @@ pub fn execute( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/data-storage/andromeda-string-storage/src/contract.rs b/contracts/data-storage/andromeda-string-storage/src/contract.rs index 172545760..eedafa00d 100644 --- a/contracts/data-storage/andromeda-string-storage/src/contract.rs +++ b/contracts/data-storage/andromeda-string-storage/src/contract.rs @@ -69,8 +69,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/ecosystem/andromeda-vault/src/contract.rs b/contracts/ecosystem/andromeda-vault/src/contract.rs index 67d4b8dcc..ac6231987 100644 --- a/contracts/ecosystem/andromeda-vault/src/contract.rs +++ b/contracts/ecosystem/andromeda-vault/src/contract.rs @@ -390,8 +390,8 @@ fn execute_update_strategy( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-conditional-splitter/src/contract.rs b/contracts/finance/andromeda-conditional-splitter/src/contract.rs index f47a74866..f0a2d1a16 100644 --- a/contracts/finance/andromeda-conditional-splitter/src/contract.rs +++ b/contracts/finance/andromeda-conditional-splitter/src/contract.rs @@ -292,8 +292,8 @@ fn execute_update_lock(ctx: ExecuteContext, lock_time: Expiry) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-cross-chain-swap/src/contract.rs b/contracts/finance/andromeda-cross-chain-swap/src/contract.rs index 6a7eced62..327841421 100644 --- a/contracts/finance/andromeda-cross-chain-swap/src/contract.rs +++ b/contracts/finance/andromeda-cross-chain-swap/src/contract.rs @@ -220,8 +220,8 @@ fn execute_swap_and_forward( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-fixed-amount-splitter/src/contract.rs b/contracts/finance/andromeda-fixed-amount-splitter/src/contract.rs index 4fc921ab7..9c47cb1d8 100644 --- a/contracts/finance/andromeda-fixed-amount-splitter/src/contract.rs +++ b/contracts/finance/andromeda-fixed-amount-splitter/src/contract.rs @@ -443,8 +443,8 @@ fn execute_update_lock(ctx: ExecuteContext, lock_time: Expiry) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-rate-limiting-withdrawals/src/contract.rs b/contracts/finance/andromeda-rate-limiting-withdrawals/src/contract.rs index 89ba69443..f1fe17217 100644 --- a/contracts/finance/andromeda-rate-limiting-withdrawals/src/contract.rs +++ b/contracts/finance/andromeda-rate-limiting-withdrawals/src/contract.rs @@ -230,8 +230,8 @@ fn execute_withdraw(ctx: ExecuteContext, amount: Uint128) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[entry_point] diff --git a/contracts/finance/andromeda-splitter/src/contract.rs b/contracts/finance/andromeda-splitter/src/contract.rs index cb468bddc..376761a59 100644 --- a/contracts/finance/andromeda-splitter/src/contract.rs +++ b/contracts/finance/andromeda-splitter/src/contract.rs @@ -431,8 +431,8 @@ fn execute_update_default_recipient( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-timelock/src/contract.rs b/contracts/finance/andromeda-timelock/src/contract.rs index 816bcfd86..0d5abecb3 100644 --- a/contracts/finance/andromeda-timelock/src/contract.rs +++ b/contracts/finance/andromeda-timelock/src/contract.rs @@ -202,8 +202,8 @@ fn execute_release_specific_funds( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-validator-staking/src/contract.rs b/contracts/finance/andromeda-validator-staking/src/contract.rs index 572bde9e0..bc31cc291 100644 --- a/contracts/finance/andromeda-validator-staking/src/contract.rs +++ b/contracts/finance/andromeda-validator-staking/src/contract.rs @@ -102,8 +102,8 @@ pub fn handle_execute(ctx: ExecuteContext, msg: ExecuteMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-vesting/src/contract.rs b/contracts/finance/andromeda-vesting/src/contract.rs index 9b4a8b316..9c1a528d9 100644 --- a/contracts/finance/andromeda-vesting/src/contract.rs +++ b/contracts/finance/andromeda-vesting/src/contract.rs @@ -363,8 +363,8 @@ fn claim_batch( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/finance/andromeda-weighted-distribution-splitter/src/contract.rs b/contracts/finance/andromeda-weighted-distribution-splitter/src/contract.rs index 85c934b84..548ea764c 100644 --- a/contracts/finance/andromeda-weighted-distribution-splitter/src/contract.rs +++ b/contracts/finance/andromeda-weighted-distribution-splitter/src/contract.rs @@ -477,8 +477,8 @@ fn execute_update_lock(ctx: ExecuteContext, lock_time: Expiry) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[entry_point] diff --git a/contracts/fungible-tokens/andromeda-cw20-exchange/src/contract.rs b/contracts/fungible-tokens/andromeda-cw20-exchange/src/contract.rs index 0298ed5a1..574376ec7 100644 --- a/contracts/fungible-tokens/andromeda-cw20-exchange/src/contract.rs +++ b/contracts/fungible-tokens/andromeda-cw20-exchange/src/contract.rs @@ -422,8 +422,8 @@ pub fn execute_cancel_sale( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/fungible-tokens/andromeda-cw20-staking/src/contract.rs b/contracts/fungible-tokens/andromeda-cw20-staking/src/contract.rs index 65251ecd7..e506d0de4 100644 --- a/contracts/fungible-tokens/andromeda-cw20-staking/src/contract.rs +++ b/contracts/fungible-tokens/andromeda-cw20-staking/src/contract.rs @@ -883,8 +883,8 @@ fn query_stakers( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/fungible-tokens/andromeda-cw20/src/contract.rs b/contracts/fungible-tokens/andromeda-cw20/src/contract.rs index 517bac9fd..83c13b3de 100644 --- a/contracts/fungible-tokens/andromeda-cw20/src/contract.rs +++ b/contracts/fungible-tokens/andromeda-cw20/src/contract.rs @@ -388,8 +388,8 @@ fn filter_out_cw20_messages( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/fungible-tokens/andromeda-cw20/src/testing/tests.rs b/contracts/fungible-tokens/andromeda-cw20/src/testing/tests.rs index 6bc3115c2..8f88b50f8 100644 --- a/contracts/fungible-tokens/andromeda-cw20/src/testing/tests.rs +++ b/contracts/fungible-tokens/andromeda-cw20/src/testing/tests.rs @@ -112,7 +112,7 @@ fn test_transfer() { ]); // Blacklist the sender who otherwise would have been able to call the function successfully - let permission = Permission::Local(LocalPermission::blacklisted(None)); + let permission = Permission::Local(LocalPermission::blacklisted(None, None)); let actors = vec![AndrAddr::from_string("sender")]; let action = "Transfer"; let ctx = ExecuteContext::new(deps.as_mut(), mock_info("owner", &[]), mock_env()); @@ -125,7 +125,7 @@ fn test_transfer() { assert_eq!(err, ContractError::Unauthorized {}); // Now whitelist the sender, that should allow him to call the function successfully - let permission = Permission::Local(LocalPermission::whitelisted(None)); + let permission = Permission::Local(LocalPermission::whitelisted(None, None)); let actors = vec![AndrAddr::from_string("sender")]; let action = "Transfer"; let ctx = ExecuteContext::new(deps.as_mut(), mock_info("owner", &[]), mock_env()); diff --git a/contracts/fungible-tokens/andromeda-lockdrop/src/contract.rs b/contracts/fungible-tokens/andromeda-lockdrop/src/contract.rs index 8afaa46f5..4fcd22dbc 100644 --- a/contracts/fungible-tokens/andromeda-lockdrop/src/contract.rs +++ b/contracts/fungible-tokens/andromeda-lockdrop/src/contract.rs @@ -132,8 +132,8 @@ pub fn handle_execute(mut ctx: ExecuteContext, msg: ExecuteMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } pub fn receive_cw20( diff --git a/contracts/fungible-tokens/andromeda-merkle-airdrop/src/contract.rs b/contracts/fungible-tokens/andromeda-merkle-airdrop/src/contract.rs index db1d2bd5c..06f41a115 100644 --- a/contracts/fungible-tokens/andromeda-merkle-airdrop/src/contract.rs +++ b/contracts/fungible-tokens/andromeda-merkle-airdrop/src/contract.rs @@ -69,7 +69,7 @@ pub fn instantiate( deps.storage, SEND_CW20_ACTION, addr, - Permission::Local(LocalPermission::whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } @@ -361,8 +361,8 @@ pub fn query_total_claimed(deps: Deps, stage: u8) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-counter/src/contract.rs b/contracts/math/andromeda-counter/src/contract.rs index 62be026d0..7eff17fa7 100644 --- a/contracts/math/andromeda-counter/src/contract.rs +++ b/contracts/math/andromeda-counter/src/contract.rs @@ -297,8 +297,8 @@ pub fn has_permission(storage: &dyn Storage, addr: &Addr) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-curve/src/contract.rs b/contracts/math/andromeda-curve/src/contract.rs index b38b8b7dc..53c4a1aca 100644 --- a/contracts/math/andromeda-curve/src/contract.rs +++ b/contracts/math/andromeda-curve/src/contract.rs @@ -61,13 +61,13 @@ pub fn instantiate( deps.storage, UPDATE_CURVE_CONFIG_ACTION, addr.clone(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; ADOContract::set_permission( deps.storage, RESET_ACTION, addr.clone(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } } @@ -232,8 +232,8 @@ pub fn query_plot_y_from_x( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-date-time/src/contract.rs b/contracts/math/andromeda-date-time/src/contract.rs index 24887c784..d2346afcb 100644 --- a/contracts/math/andromeda-date-time/src/contract.rs +++ b/contracts/math/andromeda-date-time/src/contract.rs @@ -121,8 +121,8 @@ pub fn get_date_time( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-distance/src/contract.rs b/contracts/math/andromeda-distance/src/contract.rs index 0f8dd93b3..2471a8c39 100644 --- a/contracts/math/andromeda-distance/src/contract.rs +++ b/contracts/math/andromeda-distance/src/contract.rs @@ -164,8 +164,8 @@ fn decimal_validate(decimal: u16) -> Result<(), ContractError> { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-graph/src/contract.rs b/contracts/math/andromeda-graph/src/contract.rs index a65a65ac0..c6e844c4d 100644 --- a/contracts/math/andromeda-graph/src/contract.rs +++ b/contracts/math/andromeda-graph/src/contract.rs @@ -419,8 +419,8 @@ pub fn get_user_coordinate(deps: Deps, user: AndrAddr) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-matrix/src/contract.rs b/contracts/math/andromeda-matrix/src/contract.rs index 730031820..17f2a5469 100644 --- a/contracts/math/andromeda-matrix/src/contract.rs +++ b/contracts/math/andromeda-matrix/src/contract.rs @@ -59,13 +59,13 @@ pub fn instantiate( deps.storage, STORE_MATRIX_ACTION, addr.clone(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; ADOContract::set_permission( deps.storage, DELETE_MATRIX_ACTION, addr.clone(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } } @@ -100,8 +100,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } pub fn handle_execute(mut ctx: ExecuteContext, msg: ExecuteMsg) -> Result { diff --git a/contracts/math/andromeda-point/src/contract.rs b/contracts/math/andromeda-point/src/contract.rs index 106d422db..3272c859d 100644 --- a/contracts/math/andromeda-point/src/contract.rs +++ b/contracts/math/andromeda-point/src/contract.rs @@ -69,8 +69,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/math/andromeda-shunting/src/contract.rs b/contracts/math/andromeda-shunting/src/contract.rs index 67111dd07..3b8d07056 100644 --- a/contracts/math/andromeda-shunting/src/contract.rs +++ b/contracts/math/andromeda-shunting/src/contract.rs @@ -190,8 +190,8 @@ fn eval(expr: &str) -> Result { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/modules/andromeda-address-list/src/contract.rs b/contracts/modules/andromeda-address-list/src/contract.rs index 627f083c0..12473f5f6 100644 --- a/contracts/modules/andromeda-address-list/src/contract.rs +++ b/contracts/modules/andromeda-address-list/src/contract.rs @@ -39,7 +39,7 @@ pub fn instantiate( !actor_permission.actors.is_empty(), ContractError::NoActorsProvided {} ); - + actor_permission.permission.validate_times(&env)?; for actor in actor_permission.actors { let verified_actor = actor.get_raw_address(&deps.as_ref())?; add_actors_permission(deps.storage, verified_actor, &actor_permission.permission)?; @@ -95,7 +95,9 @@ fn execute_permission_actors( actors: Vec, permission: LocalPermission, ) -> Result { - let ExecuteContext { deps, info, .. } = ctx; + let ExecuteContext { + deps, env, info, .. + } = ctx; nonpayable(&info)?; ensure!( ADOContract::default().is_owner_or_operator(deps.storage, info.sender.as_str())?, @@ -107,6 +109,7 @@ fn execute_permission_actors( }); } ensure!(!actors.is_empty(), ContractError::NoActorsProvided {}); + permission.validate_times(&env)?; for actor in actors.clone() { let verified_actor = actor.get_raw_address(&deps.as_ref())?; add_actors_permission(deps.storage, verified_actor, &permission)?; @@ -157,8 +160,8 @@ fn execute_remove_permissions( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/modules/andromeda-address-list/src/testing/tests.rs b/contracts/modules/andromeda-address-list/src/testing/tests.rs index ba26f8541..9ba2b2233 100644 --- a/contracts/modules/andromeda-address-list/src/testing/tests.rs +++ b/contracts/modules/andromeda-address-list/src/testing/tests.rs @@ -26,7 +26,7 @@ fn init(deps: DepsMut, info: MessageInfo) { owner: None, actor_permission: Some(ActorPermission { actors: vec![AndrAddr::from_string("actor")], - permission: LocalPermission::whitelisted(None), + permission: LocalPermission::whitelisted(None, None), }), }, ) diff --git a/contracts/modules/andromeda-rates/src/contract.rs b/contracts/modules/andromeda-rates/src/contract.rs index 758712745..4bad10940 100644 --- a/contracts/modules/andromeda-rates/src/contract.rs +++ b/contracts/modules/andromeda-rates/src/contract.rs @@ -113,8 +113,8 @@ fn execute_remove_rate(ctx: ExecuteContext, action: String) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/modules/andromeda-schema/src/contract.rs b/contracts/modules/andromeda-schema/src/contract.rs index 634f3fd3b..b53d0901d 100644 --- a/contracts/modules/andromeda-schema/src/contract.rs +++ b/contracts/modules/andromeda-schema/src/contract.rs @@ -84,8 +84,8 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/non-fungible-tokens/andromeda-auction/src/contract.rs b/contracts/non-fungible-tokens/andromeda-auction/src/contract.rs index 84148b335..8c0894b54 100644 --- a/contracts/non-fungible-tokens/andromeda-auction/src/contract.rs +++ b/contracts/non-fungible-tokens/andromeda-auction/src/contract.rs @@ -315,7 +315,7 @@ fn execute_start_auction( deps.storage, auction_id.to_string(), whitelisted_address, - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } }; @@ -438,7 +438,7 @@ fn execute_update_auction( deps.storage, token_auction_state.auction_id.to_string(), whitelisted_address, - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } }; @@ -1409,8 +1409,8 @@ fn query_authorized_addresses( Ok(AuthorizedAddressesResponse { addresses }) } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/non-fungible-tokens/andromeda-crowdfund/src/contract.rs b/contracts/non-fungible-tokens/andromeda-crowdfund/src/contract.rs index 81766cdf7..ec0ea9e95 100644 --- a/contracts/non-fungible-tokens/andromeda-crowdfund/src/contract.rs +++ b/contracts/non-fungible-tokens/andromeda-crowdfund/src/contract.rs @@ -75,7 +75,7 @@ pub fn instantiate( deps.storage, SEND_CW20_ACTION, addr, - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } @@ -99,9 +99,9 @@ pub fn reply(_deps: DepsMut, _env: Env, msg: Reply) -> Result Result { +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { ensure_compatibility(&deps.as_ref(), "1.1.0")?; - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/non-fungible-tokens/andromeda-cw721/src/contract.rs b/contracts/non-fungible-tokens/andromeda-cw721/src/contract.rs index 4db47bfa1..e743ee267 100644 --- a/contracts/non-fungible-tokens/andromeda-cw721/src/contract.rs +++ b/contracts/non-fungible-tokens/andromeda-cw721/src/contract.rs @@ -506,8 +506,8 @@ pub fn query_minter(deps: Deps) -> Result { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/non-fungible-tokens/andromeda-marketplace/src/contract.rs b/contracts/non-fungible-tokens/andromeda-marketplace/src/contract.rs index ce175ce26..acd8414bd 100644 --- a/contracts/non-fungible-tokens/andromeda-marketplace/src/contract.rs +++ b/contracts/non-fungible-tokens/andromeda-marketplace/src/contract.rs @@ -900,8 +900,8 @@ fn query_authorized_addresses( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/non-fungible-tokens/andromeda-marketplace/src/testing/tests.rs b/contracts/non-fungible-tokens/andromeda-marketplace/src/testing/tests.rs index 377976c85..e53e0149a 100644 --- a/contracts/non-fungible-tokens/andromeda-marketplace/src/testing/tests.rs +++ b/contracts/non-fungible-tokens/andromeda-marketplace/src/testing/tests.rs @@ -229,7 +229,7 @@ fn test_instantiate_with_multiple_authorized_cw20_addresses() { ADOContract::get_permission(deps.as_ref().storage, SEND_CW20_ACTION, raw_addr).unwrap(); assert_eq!( permission, - Some(Permission::Local(LocalPermission::Whitelisted(None))) + Some(Permission::Local(LocalPermission::whitelisted(None, None))) ); } @@ -1024,7 +1024,7 @@ fn test_execute_authorize_cw20_contract() { .unwrap(); assert_eq!( permission, - Some(Permission::Local(LocalPermission::Whitelisted(None))) + Some(Permission::Local(LocalPermission::whitelisted(None, None))) ); // Test successful authorization with expiration @@ -1042,7 +1042,7 @@ fn test_execute_authorize_cw20_contract() { vec![ attr("action", "authorize_contract"), attr("address", "cw20_contract_with_expiry"), - attr("permission", format!("whitelisted:{}", expiration)), + attr("permission", format!("whitelisted until:{}", expiration)), ] ); @@ -1055,9 +1055,10 @@ fn test_execute_authorize_cw20_contract() { .unwrap(); assert_eq!( permission, - Some(Permission::Local(LocalPermission::Whitelisted(Some( - expiration - )))) + Some(Permission::Local(LocalPermission::whitelisted( + None, + Some(expiration), + ))) ); } @@ -1081,7 +1082,7 @@ fn test_execute_deauthorize_cw20_contract() { .unwrap(); assert_eq!( permission, - Some(Permission::Local(LocalPermission::Whitelisted(None))) + Some(Permission::Local(LocalPermission::whitelisted(None, None))) ); // Now deauthorize the CW20 contract @@ -1181,7 +1182,7 @@ fn test_authorize_token_contract() { vec![ attr("action", "authorize_contract"), attr("address", "nft_contract"), - attr("permission", format!("whitelisted:{}", expiration)), + attr("permission", format!("whitelisted until:{}", expiration)), ] ); diff --git a/contracts/os/andromeda-adodb/src/contract.rs b/contracts/os/andromeda-adodb/src/contract.rs index 8f6d07a71..c3ac5e783 100644 --- a/contracts/os/andromeda-adodb/src/contract.rs +++ b/contracts/os/andromeda-adodb/src/contract.rs @@ -93,8 +93,8 @@ pub fn execute( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/os/andromeda-economics/src/contract.rs b/contracts/os/andromeda-economics/src/contract.rs index 8d46c1c33..d1f2654c9 100644 --- a/contracts/os/andromeda-economics/src/contract.rs +++ b/contracts/os/andromeda-economics/src/contract.rs @@ -100,8 +100,8 @@ pub fn cw20_receive( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/os/andromeda-ibc-registry/src/contract.rs b/contracts/os/andromeda-ibc-registry/src/contract.rs index 8b458df59..23c168a4a 100644 --- a/contracts/os/andromeda-ibc-registry/src/contract.rs +++ b/contracts/os/andromeda-ibc-registry/src/contract.rs @@ -57,7 +57,7 @@ pub fn instantiate( deps.storage, STORE_DENOM_INFO, service_address.clone(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; Ok(resp.add_attribute("service_address", service_address)) @@ -190,8 +190,8 @@ pub fn get_all_denom_info( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/os/andromeda-kernel/src/contract.rs b/contracts/os/andromeda-kernel/src/contract.rs index a5eed9c3d..0cae443b7 100644 --- a/contracts/os/andromeda-kernel/src/contract.rs +++ b/contracts/os/andromeda-kernel/src/contract.rs @@ -155,8 +155,8 @@ pub fn sudo(deps: DepsMut, _env: Env, msg: SudoMsg) -> Result Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/os/andromeda-vfs/src/contract.rs b/contracts/os/andromeda-vfs/src/contract.rs index 61a7fd8df..2705bd2ee 100644 --- a/contracts/os/andromeda-vfs/src/contract.rs +++ b/contracts/os/andromeda-vfs/src/contract.rs @@ -93,8 +93,8 @@ pub fn execute( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { - ADOContract::default().migrate(deps, CONTRACT_NAME, CONTRACT_VERSION) +pub fn migrate(deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result { + ADOContract::default().migrate(deps, env, CONTRACT_NAME, CONTRACT_VERSION) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index 7e6f0a7bf..154d0912a 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -46,6 +46,7 @@ prost = { version = "0.11.2", default-features = false, features = [ [dev-dependencies] cw-multi-test = { workspace = true } +rstest = "0.24.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] cw-orch = { workspace = true } diff --git a/packages/std/src/ado_base/permissioning.rs b/packages/std/src/ado_base/permissioning.rs index 8aca6f656..4d177d1bd 100644 --- a/packages/std/src/ado_base/permissioning.rs +++ b/packages/std/src/ado_base/permissioning.rs @@ -1,12 +1,13 @@ use core::fmt; use cosmwasm_schema::cw_serde; -use cosmwasm_std::Env; +use cosmwasm_std::{Deps, Env}; use crate::{ amp::AndrAddr, common::{expiration::Expiry, MillisecondsExpiration}, error::ContractError, + os::aos_querier::AOSQuerier, }; #[cw_serde] @@ -54,36 +55,56 @@ pub struct PermissionedActorsResponse { /// Expiration defaults to `Never` if not provided #[cw_serde] pub enum LocalPermission { - Blacklisted(Option), + Blacklisted { + start: Option, + expiration: Option, + }, Limited { + start: Option, expiration: Option, uses: u32, }, - Whitelisted(Option), + Whitelisted { + start: Option, + expiration: Option, + }, } impl std::default::Default for LocalPermission { fn default() -> Self { - Self::Whitelisted(None) + Self::Whitelisted { + start: None, + expiration: None, + } } } impl LocalPermission { - pub fn blacklisted(expiration: Option) -> Self { - Self::Blacklisted(expiration) + pub fn blacklisted(start: Option, expiration: Option) -> Self { + Self::Blacklisted { start, expiration } } - pub fn whitelisted(expiration: Option) -> Self { - Self::Whitelisted(expiration) + pub fn whitelisted(start: Option, expiration: Option) -> Self { + Self::Whitelisted { start, expiration } } - pub fn limited(expiration: Option, uses: u32) -> Self { - Self::Limited { expiration, uses } + pub fn limited(start: Option, expiration: Option, uses: u32) -> Self { + Self::Limited { + start, + expiration, + uses, + } } pub fn is_permissioned(&self, env: &Env, strict: bool) -> bool { match self { - Self::Blacklisted(expiration) => { + Self::Blacklisted { start, expiration } => { + // If start time hasn't started yet, then it should return true + if let Some(start) = start { + if !start.get_time(&env.block).is_expired(&env.block) { + return true; + } + } if let Some(expiration) = expiration { if expiration.get_time(&env.block).is_expired(&env.block) { return !strict; @@ -91,7 +112,16 @@ impl LocalPermission { } false } - Self::Limited { expiration, uses } => { + Self::Limited { + start, + expiration, + uses, + } => { + if let Some(start) = start { + if !start.get_time(&env.block).is_expired(&env.block) { + return true; + } + } if let Some(expiration) = expiration { if expiration.get_time(&env.block).is_expired(&env.block) { return !strict; @@ -102,7 +132,12 @@ impl LocalPermission { } true } - Self::Whitelisted(expiration) => { + Self::Whitelisted { start, expiration } => { + if let Some(start) = start { + if !start.get_time(&env.block).is_expired(&env.block) { + return !strict; + } + } if let Some(expiration) = expiration { if expiration.get_time(&env.block).is_expired(&env.block) { return !strict; @@ -115,18 +150,30 @@ impl LocalPermission { pub fn get_expiration(&self, env: Env) -> MillisecondsExpiration { match self { - Self::Blacklisted(expiration) => { + Self::Blacklisted { expiration, .. } => { expiration.clone().unwrap_or_default().get_time(&env.block) } Self::Limited { expiration, .. } => { expiration.clone().unwrap_or_default().get_time(&env.block) } - Self::Whitelisted(expiration) => { + Self::Whitelisted { expiration, .. } => { expiration.clone().unwrap_or_default().get_time(&env.block) } } } + pub fn get_start_time(&self, env: Env) -> MillisecondsExpiration { + match self { + Self::Blacklisted { start, .. } => { + start.clone().unwrap_or_default().get_time(&env.block) + } + Self::Limited { start, .. } => start.clone().unwrap_or_default().get_time(&env.block), + Self::Whitelisted { start, .. } => { + start.clone().unwrap_or_default().get_time(&env.block) + } + } + } + pub fn consume_use(&mut self) -> Result<(), ContractError> { if let Self::Limited { uses, .. } = self { *uses = uses.saturating_sub(1); @@ -134,32 +181,70 @@ impl LocalPermission { Ok(()) } + + pub fn validate_times(&self, env: &Env) -> Result<(), ContractError> { + let (start, expiration) = match self { + Self::Blacklisted { start, expiration } + | Self::Limited { + start, expiration, .. + } + | Self::Whitelisted { start, expiration } => (start, expiration), + }; + + if let (Some(start), Some(expiration)) = (start, expiration) { + let start_time = start.get_time(&env.block); + let exp_time = expiration.get_time(&env.block); + + println!("start_time: {:?}", start_time); + println!("exp_time: {:?}", exp_time); + + // Check if start time is after current time + if start_time.is_expired(&env.block) { + return Err(ContractError::StartTimeInThePast { + current_time: env.block.time.seconds(), + current_block: env.block.height, + }); + } + + // Check if expiration time is after current time + if exp_time.is_expired(&env.block) { + return Err(ContractError::ExpirationInPast {}); + } + + // Check if start time is before expiration time + if start_time > exp_time { + return Err(ContractError::StartTimeAfterEndTime {}); + } + } + Ok(()) + } } impl fmt::Display for LocalPermission { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let self_as_string = match self { - Self::Blacklisted(expiration) => { - if let Some(expiration) = expiration { - format!("blacklisted:{expiration}") - } else { - "blacklisted".to_string() - } - } - Self::Limited { expiration, uses } => { - if let Some(expiration) = expiration { - format!("limited:{expiration}:{uses}") - } else { - format!("limited:{uses}") - } - } - Self::Whitelisted(expiration) => { - if let Some(expiration) = expiration { - format!("whitelisted:{expiration}") - } else { - "whitelisted".to_string() - } - } + Self::Blacklisted { start, expiration } => match (start, expiration) { + (Some(s), Some(e)) => format!("blacklisted starting from:{s} until:{e}"), + (Some(s), None) => format!("blacklisted starting from:{s}"), + (None, Some(e)) => format!("blacklisted until:{e}"), + (None, None) => "blacklisted".to_string(), + }, + Self::Limited { + start, + expiration, + uses, + } => match (start, expiration) { + (Some(s), Some(e)) => format!("limited starting from:{s} until:{e} uses:{uses}"), + (Some(s), None) => format!("limited starting from:{s} uses:{uses}"), + (None, Some(e)) => format!("limited until:{e} uses:{uses}"), + (None, None) => format!("limited uses:{uses}"), + }, + Self::Whitelisted { start, expiration } => match (start, expiration) { + (Some(s), Some(e)) => format!("whitelisted starting from:{s} until:{e}"), + (Some(s), None) => format!("whitelisted starting from:{s}"), + (None, Some(e)) => format!("whitelisted until:{e}"), + (None, None) => "whitelisted".to_string(), + }, }; write!(f, "{self_as_string}") } @@ -171,6 +256,29 @@ pub enum Permission { Contract(AndrAddr), } +impl Permission { + pub fn get_permission( + &mut self, + deps: Deps, + actor: &str, + ) -> Result { + match self { + Self::Local(local_permission) => Ok(local_permission.clone()), + Self::Contract(contract_address) => { + let addr = contract_address.get_raw_address(&deps)?; + let local_permission = AOSQuerier::get_permission(&deps.querier, &addr, actor)?; + Ok(local_permission) + } + } + } + pub fn validate_times(&self, env: &Env) -> Result<(), ContractError> { + match self { + Self::Local(local_permission) => local_permission.validate_times(env), + Self::Contract(_) => Ok(()), + } + } +} + impl fmt::Display for Permission { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let self_as_string = match self { @@ -180,3 +288,112 @@ impl fmt::Display for Permission { write!(f, "{self_as_string}") } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::common::Milliseconds; + use cosmwasm_std::testing::mock_env; + use rstest::rstest; + + #[rstest] + #[case::valid_future_times(1000, 2000)] // start in 100s, expire in 200s + #[case::same_start_and_end(1000, 1000)] // edge case: start and end at same time + #[case::far_future(10000, 20000)] // times far in the future + fn test_valid_time_combinations(#[case] start_offset: u64, #[case] exp_offset: u64) { + let env = mock_env(); + let current_time = env.block.time.seconds(); + + let permission = LocalPermission::Whitelisted { + start: Some(Expiry::AtTime( + Milliseconds(start_offset).plus_seconds(current_time), + )), + expiration: Some(Expiry::AtTime( + Milliseconds(exp_offset).plus_seconds(current_time), + )), + }; + + let result = permission.validate_times(&env); + println!("result: {:?}", result); + assert!(result.is_ok()); + } + + #[rstest] + #[case::start_in_past( + 0, // start 100s in past + 1000, // expire 100s in future + ContractError::StartTimeInThePast { current_time: 1571797419, current_block: 12345 } + )] + #[case::expiration_in_past( + 1000, // start 100s in future + 0, // expire 100s in past + ContractError::ExpirationInPast {} + )] + #[case::start_after_end( + 2000, // start 200s in future + 1000, // expire 100s in future + ContractError::StartTimeAfterEndTime {} + )] + fn test_invalid_time_combinations( + #[case] start_offset: u64, + #[case] exp_offset: u64, + #[case] expected_error: ContractError, + ) { + let env = mock_env(); + let current_time = env.block.time.seconds(); + + let permission = LocalPermission::Whitelisted { + start: Some(Expiry::AtTime( + Milliseconds(start_offset).plus_seconds(current_time), + )), + expiration: Some(Expiry::AtTime( + Milliseconds(exp_offset).plus_seconds(current_time), + )), + }; + + let result = permission.validate_times(&env); + assert!(result.is_err()); + assert_eq!(result.unwrap_err().to_string(), expected_error.to_string()); + } + + #[rstest] + fn test_no_times_specified() { + let env = mock_env(); + + let permission = LocalPermission::Whitelisted { + start: None, + expiration: None, + }; + + let result = permission.validate_times(&env); + assert!(result.is_ok()); + } + + #[rstest] + fn test_only_start_time() { + let env = mock_env(); + let current_time = env.block.time.seconds(); + + let permission = LocalPermission::Whitelisted { + start: Some(Expiry::AtTime(Milliseconds(current_time + 100))), + expiration: None, + }; + + let result = permission.validate_times(&env); + assert!(result.is_ok()); + } + + #[rstest] + fn test_only_expiration_time() { + let env = mock_env(); + let current_time = env.block.time.seconds(); + + let permission = LocalPermission::Whitelisted { + start: None, + expiration: Some(Expiry::AtTime(Milliseconds(current_time + 100))), + }; + + let result = permission.validate_times(&env); + assert!(result.is_ok()); + } +} diff --git a/packages/std/src/ado_contract/execute.rs b/packages/std/src/ado_contract/execute.rs index d9b9bd0cb..8ab5da096 100644 --- a/packages/std/src/ado_contract/execute.rs +++ b/packages/std/src/ado_contract/execute.rs @@ -6,26 +6,24 @@ use { std::ops::Deref, }; -use crate::ado_contract::ADOContract; -use crate::amp::addresses::AndrAddr; -use crate::amp::messages::AMPPkt; -use crate::common::context::ExecuteContext; -use crate::common::reply::ReplyId; -use crate::error::from_semver; -use crate::os::{aos_querier::AOSQuerier, economics::ExecuteMsg as EconomicsExecuteMsg}; use crate::{ - ado_base::{AndromedaMsg, InstantiateMsg}, - error::ContractError, + ado_base::{ + permissioning::{LocalPermission, Permission}, + AndromedaMsg, InstantiateMsg, + }, + ado_contract::ADOContract, + amp::{addresses::AndrAddr, messages::AMPPkt}, + common::{context::ExecuteContext, reply::ReplyId}, + error::{from_semver, ContractError}, + os::{aos_querier::AOSQuerier, economics::ExecuteMsg as EconomicsExecuteMsg}, }; use cosmwasm_std::{ attr, ensure, from_json, to_json_binary, Addr, Api, ContractInfoResponse, CosmosMsg, Deps, DepsMut, Env, MessageInfo, QuerierWrapper, Response, StdError, Storage, SubMsg, WasmMsg, }; use cw2::{get_contract_version, set_contract_version}; - use semver::Version; -use serde::de::DeserializeOwned; -use serde::Serialize; +use serde::{de::DeserializeOwned, Serialize}; type ExecuteContextFunction = fn(ExecuteContext, M) -> Result; @@ -122,7 +120,8 @@ impl ADOContract<'_> { pub fn migrate( &self, - deps: DepsMut, + mut deps: DepsMut, + env: Env, contract_name: &str, contract_version: &str, ) -> Result { @@ -153,6 +152,84 @@ impl ADOContract<'_> { previous_contract: stored.version, } ); + let owner = self.owner.load(deps.storage)?; + + // Get all permissioned actions and actors in one pass + let permissioned_actions = self.query_permissioned_actions(deps.as_ref())?; + if !permissioned_actions.is_empty() { + // Iterate through all actions + for action in &permissioned_actions { + let actors = self.query_permissioned_actors( + deps.as_ref(), + action.clone(), + None, + None, + None, + )?; + + for actor in actors { + // Check permission structure for each actor + let permissions = self.query_permissions(deps.as_ref(), &actor, None, None)?; + // Iterate through all permissions instead of just checking the first one + for permission in permissions { + let local_permission = permission + .permission + .clone() + .get_permission(deps.as_ref(), actor.as_str())?; + + // Check if using old permission structure (without 'start' variant) + let json_str = String::from_utf8(to_json_binary(&local_permission)?.0)?; + if !json_str.contains("start") { + let ctx = ExecuteContext::new( + deps.branch(), + MessageInfo { + sender: owner.clone(), + funds: vec![], + }, + env.clone(), + ); + + // Determine permission type from JSON structure + if json_str.contains("whitelisted") { + self.execute_set_permission( + ctx, + vec![AndrAddr::from_string(actor.clone())], + action.clone(), + Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }), + )?; + } else if json_str.contains("blacklisted") { + self.execute_set_permission( + ctx, + vec![AndrAddr::from_string(actor.clone())], + action.clone(), + Permission::Local(LocalPermission::Blacklisted { + start: None, + expiration: None, + }), + )?; + } else if json_str.contains("limited") { + self.execute_set_permission( + ctx, + vec![AndrAddr::from_string(actor.clone())], + action.clone(), + Permission::Local(LocalPermission::Limited { + start: None, + expiration: None, + uses: 0, + }), + )?; + } + } else { + // If one permission is up to date, we assume that all of them are + break; + } + } + } + } + } #[cfg(feature = "rates")] { @@ -186,7 +263,7 @@ impl ADOContract<'_> { )?) .is_ok() { - self.rates.clear(deps.storage); + self.rates.clear(deps.branch().storage); } break; } @@ -196,9 +273,10 @@ impl ADOContract<'_> { } } - set_contract_version(deps.storage, contract_name, contract_version)?; + set_contract_version(deps.branch().storage, contract_name, contract_version)?; Ok(Response::default()) } + /// Validates all provided `AndrAddr` addresses. /// /// Requires the VFS address to be set if any address is a VFS path. @@ -353,45 +431,221 @@ mod tests { use crate::testing::mock_querier::MOCK_KERNEL_CONTRACT; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; - #[test] - fn test_update_app_contract() { - let contract = ADOContract::default(); - let mut deps = mock_dependencies(); - - let info = mock_info("owner", &[]); - let deps_mut = deps.as_mut(); - contract - .instantiate( - deps_mut.storage, - mock_env(), - deps_mut.api, - &deps_mut.querier, - info.clone(), - InstantiateMsg { - ado_type: "type".to_string(), - ado_version: "version".to_string(), - - kernel_address: MOCK_KERNEL_CONTRACT.to_string(), - owner: None, - }, - ) - .unwrap(); - - let address = String::from("address"); - - let msg = AndromedaMsg::UpdateAppContract { - address: address.clone(), - }; + mod app_contract { + use super::*; - let res = contract - .execute(ExecuteContext::new(deps.as_mut(), info, mock_env()), msg) - .unwrap(); + #[test] + fn test_update_app_contract() { + let contract = ADOContract::default(); + let mut deps = mock_dependencies(); - assert_eq!( - Response::new() - .add_attribute("action", "update_app_contract") - .add_attribute("address", address), - res - ); + let info = mock_info("owner", &[]); + let deps_mut = deps.as_mut(); + contract + .instantiate( + deps_mut.storage, + mock_env(), + deps_mut.api, + &deps_mut.querier, + info.clone(), + InstantiateMsg { + ado_type: "type".to_string(), + ado_version: "version".to_string(), + kernel_address: MOCK_KERNEL_CONTRACT.to_string(), + owner: None, + }, + ) + .unwrap(); + + let address = String::from("address"); + let msg = AndromedaMsg::UpdateAppContract { + address: address.clone(), + }; + + let res = contract + .execute(ExecuteContext::new(deps.as_mut(), info, mock_env()), msg) + .unwrap(); + + assert_eq!( + Response::new() + .add_attribute("action", "update_app_contract") + .add_attribute("address", address), + res + ); + } + } + + mod permissions { + use super::*; + use cosmwasm_schema::cw_serde; + use cosmwasm_std::to_json_binary; + use rstest::rstest; + + // Old permission structure without 'start' + #[cw_serde] + enum OldLocalPermission { + Whitelisted { expiration: Option }, + Blacklisted { expiration: Option }, + Limited { expiration: Option, uses: u64 }, + } + + #[rstest] + #[case( + OldLocalPermission::Whitelisted { expiration: None }, + LocalPermission::Whitelisted { start: None, expiration: None }, + "whitelisted" + )] + #[case( + OldLocalPermission::Blacklisted { expiration: None }, + LocalPermission::Blacklisted { start: None, expiration: None }, + "blacklisted" + )] + #[case( + OldLocalPermission::Limited { expiration: None, uses: 5 }, + LocalPermission::Limited { start: None, expiration: None, uses: 5 }, + "limited" + )] + fn test_permission_formats( + #[case] old_permission: OldLocalPermission, + #[case] new_permission: LocalPermission, + #[case] permission_type: &str, + ) { + // Serialize old and new permissions to JSON + let old_json = String::from_utf8(to_json_binary(&old_permission).unwrap().0).unwrap(); + let new_json = String::from_utf8(to_json_binary(&new_permission).unwrap().0).unwrap(); + + // Assert old format JSON + assert!(!old_json.contains("start")); + assert!(old_json.contains(permission_type)); + + // Assert new format JSON + assert!(new_json.contains("start")); + assert!(new_json.contains(permission_type)); + } + } + #[cfg(feature = "rates")] + mod rates { + use super::*; + + use crate::ado_base::rates::{LocalRate, LocalRateType, PercentRate}; + use cosmwasm_std::Decimal; + + #[test] + fn test_rates_migration() { + let contract = ADOContract::default(); + let mut deps = mock_dependencies(); + + // Setup initial contract state + let info = mock_info("owner", &[]); + let deps_mut = deps.as_mut(); + contract + .instantiate( + deps_mut.storage, + mock_env(), + deps_mut.api, + &deps_mut.querier, + info.clone(), + InstantiateMsg { + ado_type: "marketplace".to_string(), + ado_version: "1.0.0".to_string(), + kernel_address: MOCK_KERNEL_CONTRACT.to_string(), + owner: None, + }, + ) + .unwrap(); + + // Set up a test rate + let rate = LocalRate { + rate_type: LocalRateType::Additive, + recipient: Recipient::from_string("recipient"), + value: crate::ado_base::rates::LocalRateValue::Percent(PercentRate { + percent: Decimal::one(), + }), + description: None, + }; + + // Save the rate in storage + contract + .rates + .save(deps.as_mut().storage, "Claim", &Rate::Local(rate)) + .unwrap(); + + // Verify rate is saved + let saved_rates = contract.get_all_rates(deps.as_ref()).unwrap(); + assert_eq!(saved_rates.all_rates.len(), 1); + + // Perform migration + contract + .migrate(deps.as_mut(), mock_env(), "marketplace", "2.0.0") + .unwrap(); + + // Verify rates were handled correctly during migration + let post_migration_rates = contract.get_all_rates(deps.as_ref()).unwrap(); + assert_eq!(post_migration_rates.all_rates.len(), 1); + } + } + + mod permissions_migration { + use super::*; + use crate::ado_base::permissioning::LocalPermission; + + #[test] + fn test_permissions_migration() { + let contract = ADOContract::default(); + let mut deps = mock_dependencies(); + + // Setup initial contract state + let info = mock_info("owner", &[]); + let deps_mut = deps.as_mut(); + contract + .instantiate( + deps_mut.storage, + mock_env(), + deps_mut.api, + &deps_mut.querier, + info.clone(), + InstantiateMsg { + ado_type: "marketplace".to_string(), + ado_version: "1.0.0".to_string(), + kernel_address: MOCK_KERNEL_CONTRACT.to_string(), + owner: None, + }, + ) + .unwrap(); + + // Set up a test permission + let permission = Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }); + + // Save the permission in storage + let ctx = ExecuteContext::new(deps.as_mut(), info, mock_env()); + contract + .execute_set_permission( + ctx, + vec![AndrAddr::from_string("actor")], + "test_action".to_string(), + permission, + ) + .unwrap(); + + // Verify permission is saved + let saved_permissions = contract + .query_permissions(deps.as_ref(), "actor", None, None) + .unwrap(); + assert_eq!(saved_permissions.len(), 1); + + // Perform migration + contract + .migrate(deps.as_mut(), mock_env(), "marketplace", "2.0.0") + .unwrap(); + + // Verify permissions were handled correctly during migration + let post_migration_permissions = contract + .query_permissions(deps.as_ref(), "actor", None, None) + .unwrap(); + assert_eq!(post_migration_permissions.len(), 1); + } } } diff --git a/packages/std/src/ado_contract/permissioning.rs b/packages/std/src/ado_contract/permissioning.rs index 28d51e7e8..9978bb87e 100644 --- a/packages/std/src/ado_contract/permissioning.rs +++ b/packages/std/src/ado_contract/permissioning.rs @@ -254,6 +254,12 @@ impl ADOContract<'_> { Ok(()) } + /// Removes the permission for the given action and actor + pub fn clear_all_permissions(store: &mut dyn Storage) -> Result<(), ContractError> { + permissions().clear(store); + Ok(()) + } + /// Execute handler for setting permission /// /// **Whitelisted/Limited permissions will only work for permissioned actions** @@ -279,6 +285,7 @@ impl ADOContract<'_> { actor_addrs.push(actor_addr); } + permission.validate_times(&ctx.env)?; for actor_addr in actor_addrs.clone() { Self::set_permission( ctx.deps.storage, @@ -337,6 +344,20 @@ impl ADOContract<'_> { ])) } + /// Execute handler for clearing all permissions + pub fn execute_clear_all_permissions( + &self, + ctx: ExecuteContext, + ) -> Result { + ensure!( + Self::is_contract_owner(self, ctx.deps.storage, ctx.info.sender.as_str())?, + ContractError::Unauthorized {} + ); + Self::clear_all_permissions(ctx.deps.storage)?; + + Ok(Response::default().add_attributes(vec![("action", "clear_all_permissions")])) + } + /// Enables permissioning for a given action pub fn permission_action( &self, @@ -549,6 +570,7 @@ mod tests { }; use super::*; + use rstest::*; #[test] fn test_permissioned_action() { @@ -570,7 +592,10 @@ mod tests { let res = contract.is_permissioned(deps.as_mut(), env.clone(), action, actor); assert!(res.is_err()); - let permission = Permission::Local(LocalPermission::Whitelisted(None)); + let permission = Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned(deps.as_mut(), env.clone(), action, actor); @@ -584,6 +609,7 @@ mod tests { assert!(res.is_err()); let permission = Permission::Local(LocalPermission::Limited { + start: None, expiration: None, uses: 1, }); @@ -609,7 +635,10 @@ mod tests { .permission_action(action, deps.as_mut().storage) .unwrap(); // Test Blacklisted - let permission = Permission::Local(LocalPermission::Blacklisted(None)); + let permission = Permission::Local(LocalPermission::Blacklisted { + start: None, + expiration: None, + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned(deps.as_mut(), env, action, actor); @@ -634,7 +663,10 @@ mod tests { .unwrap(); // Test Blacklisted - let permission = Permission::Local(LocalPermission::Blacklisted(None)); + let permission = Permission::Local(LocalPermission::Blacklisted { + start: None, + expiration: None, + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned(deps.as_mut(), env, action, actor); @@ -657,7 +689,10 @@ mod tests { let res = contract.is_permissioned_strict(deps.as_mut(), env.clone(), action, actor); assert!(res.is_err()); - let permission = Permission::Local(LocalPermission::Whitelisted(None)); + let permission = Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned_strict(deps.as_mut(), env, action, actor); @@ -695,7 +730,10 @@ mod tests { let msg = AndromedaMsg::Permissioning(PermissioningMessage::SetPermission { actors: vec![AndrAddr::from_string("actor")], action: "action".to_string(), - permission: Permission::Local(LocalPermission::Whitelisted(None)), + permission: Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }), }); let ctx = ExecuteContext::new(deps.as_mut(), mock_info("attacker", &[]), env); let res = contract.execute(ctx, msg); @@ -788,7 +826,10 @@ mod tests { assert!(res.is_err()); // Test Whitelist - let permission = Permission::Local(LocalPermission::Whitelisted(Some(expiration.clone()))); + let permission = Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: Some(expiration.clone()), + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned(deps.as_mut(), env.clone(), action, actor); @@ -801,7 +842,10 @@ mod tests { env.block.time = MillisecondsExpiration::from_seconds(0).into(); // Test Blacklist - let permission = Permission::Local(LocalPermission::Blacklisted(Some(expiration.clone()))); + let permission = Permission::Local(LocalPermission::Blacklisted { + start: None, + expiration: Some(expiration.clone()), + }); ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); let res = contract.is_permissioned(deps.as_mut(), env.clone(), action, actor); @@ -820,6 +864,87 @@ mod tests { assert!(res.is_ok()); } + #[rstest] + #[case(true, true, false, true)] // Whitelist, at start time, should succeed + #[case(true, false, false, false)] // Whitelist, before start time, should error + #[case(true, false, true, true)] // Whitelist, after start time, should succeed + #[case(false, false, false, true)] // Blacklist, before start time, should succeed + #[case(false, true, false, false)] // Blacklist, at start time, should error + #[case(false, false, true, false)] // Blacklist, after start time, should error + fn test_permission_start_time( + #[case] is_whitelisted: bool, + #[case] is_at_start_time: bool, + #[case] is_after_start_time: bool, + #[case] expected_success: bool, + ) { + let contract = ADOContract::default(); + let action = "action"; + let actor = "actor"; + let start_time = 2; + let start = Some(Expiry::AtTime(MillisecondsExpiration::from_seconds( + start_time, + ))); + + let mut deps = mock_dependencies(); + let mut env = mock_env(); + + env.block.time = MillisecondsExpiration::from_seconds(if is_at_start_time { + start_time + } else if is_after_start_time { + start_time + 1 + } else { + 0 + }) + .into(); + + contract + .owner + .save(deps.as_mut().storage, &Addr::unchecked("owner")) + .unwrap(); + + ADOContract::default() + .permission_action(action, deps.as_mut().storage) + .unwrap(); + + let permission = if is_whitelisted { + Permission::Local(LocalPermission::Whitelisted { + start, + expiration: None, + }) + } else { + Permission::Local(LocalPermission::Blacklisted { + start, + expiration: None, + }) + }; + + ADOContract::set_permission(deps.as_mut().storage, action, actor, permission).unwrap(); + + let res = contract.is_permissioned(deps.as_mut(), env.clone(), action, actor); + + if expected_success { + assert!(res.is_ok()); + } else { + assert!(res.is_err()); + } + } + + #[rstest] + fn test_permission_start_time_disabled_action() { + let mut deps = mock_dependencies(); + let mut env = mock_env(); + let contract = ADOContract::default(); + let action = "action"; + let actor = "actor"; + + env.block.time = MillisecondsExpiration::from_seconds(0).into(); + + ADOContract::default().disable_action_permission(action, deps.as_mut().storage); + + let res = contract.is_permissioned(deps.as_mut(), env, action, actor); + assert!(res.is_err()); + } + #[test] fn test_context_permissions() { let mut deps = mock_dependencies(); @@ -860,7 +985,10 @@ mod tests { .unwrap()); let mut context = ExecuteContext::new(deps.as_mut(), info.clone(), env.clone()); - let permission = Permission::Local(LocalPermission::Whitelisted(None)); + let permission = Permission::Local(LocalPermission::Whitelisted { + start: None, + expiration: None, + }); ADOContract::set_permission(context.deps.storage, action, actor, permission).unwrap(); assert!(is_context_permissioned( @@ -938,7 +1066,7 @@ mod tests { let amp_ctx = AMPPkt::new("mock_actor", "owner", vec![]); let mut context = - ExecuteContext::new(deps.as_mut(), unauth_info, env.clone()).with_ctx(amp_ctx); + ExecuteContext::new(deps.as_mut(), unauth_info.clone(), env.clone()).with_ctx(amp_ctx); assert!(is_context_permissioned( &mut context.deps, @@ -952,7 +1080,11 @@ mod tests { let previous_sender = "previous_sender"; let mut context = ExecuteContext::new(deps.as_mut(), info.clone(), env.clone()) .with_ctx(AMPPkt::new(info.sender, previous_sender, vec![])); - let permission = Permission::Local(LocalPermission::limited(None, 1)); + let permission = Permission::Local(LocalPermission::Limited { + start: None, + expiration: None, + uses: 1, + }); ADOContract::set_permission(context.deps.storage, action, actor, permission.clone()) .unwrap(); ADOContract::set_permission( @@ -979,7 +1111,7 @@ mod tests { assert_eq!(previous_sender_permission, Some(permission)); assert_eq!( actor_permission, - Some(Permission::Local(LocalPermission::limited(None, 0))) + Some(Permission::Local(LocalPermission::limited(None, None, 0))) ); } @@ -1009,7 +1141,7 @@ mod tests { .unwrap()); let context = ExecuteContext::new(deps.as_mut(), info, env.clone()); - let permission = Permission::Local(LocalPermission::Whitelisted(None)); + let permission = Permission::Local(LocalPermission::whitelisted(None, None)); ADOContract::set_permission(context.deps.storage, action, actor, permission).unwrap(); assert!(is_context_permissioned_strict( @@ -1083,7 +1215,7 @@ mod tests { assert!(permissions.is_empty()); - let permission = Permission::Local(LocalPermission::Whitelisted(None)); + let permission = Permission::Local(LocalPermission::whitelisted(None, None)); let action = "action"; ADOContract::set_permission(deps.as_mut().storage, action, actor, permission.clone()) @@ -1100,19 +1232,19 @@ mod tests { let multi_permissions = vec![ ( "action2".to_string(), - Permission::Local(LocalPermission::Blacklisted(None)), + Permission::Local(LocalPermission::blacklisted(None, None)), ), ( "action3".to_string(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), ), ( "action4".to_string(), - Permission::Local(LocalPermission::Blacklisted(None)), + Permission::Local(LocalPermission::blacklisted(None, None)), ), ( "action5".to_string(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), ), ]; diff --git a/packages/std/src/common/denom.rs b/packages/std/src/common/denom.rs index f7bc9dd78..cd8b89536 100644 --- a/packages/std/src/common/denom.rs +++ b/packages/std/src/common/denom.rs @@ -139,7 +139,7 @@ pub fn authorize_addresses( deps.storage, action, addr.to_string(), - Permission::Local(LocalPermission::Whitelisted(None)), + Permission::Local(LocalPermission::whitelisted(None, None)), )?; } Ok(()) @@ -159,8 +159,8 @@ pub fn execute_authorize_contract( ); let permission = expiration.map_or( - Permission::Local(LocalPermission::Whitelisted(None)), - |expiration| Permission::Local(LocalPermission::Whitelisted(Some(expiration))), + Permission::Local(LocalPermission::whitelisted(None, None)), + |expiration| Permission::Local(LocalPermission::whitelisted(None, Some(expiration))), ); ADOContract::set_permission( diff --git a/tests-integration/tests/auction_app.rs b/tests-integration/tests/auction_app.rs index 75dc38318..67a72a27e 100644 --- a/tests-integration/tests/auction_app.rs +++ b/tests-integration/tests/auction_app.rs @@ -641,7 +641,7 @@ fn test_auction_app_cw20_restricted() { // Try to set permission with an empty vector of actors let actors = vec![]; let action = "PlaceBid".to_string(); - let permission = Permission::Local(LocalPermission::blacklisted(None)); + let permission = Permission::Local(LocalPermission::blacklisted(None, None)); let err: ContractError = auction .execute_set_permission(&mut router, owner.clone(), actors, action, permission) .unwrap_err() @@ -656,7 +656,7 @@ fn test_auction_app_cw20_restricted() { AndrAddr::from_string(buyer_three.clone()), ]; let action = "PlaceBid".to_string(); - let permission = Permission::Local(LocalPermission::blacklisted(None)); + let permission = Permission::Local(LocalPermission::blacklisted(None, None)); auction .execute_set_permission(&mut router, owner.clone(), actors, action, permission) .unwrap(); @@ -692,7 +692,7 @@ fn test_auction_app_cw20_restricted() { // Now whitelist bidder one let actors = vec![AndrAddr::from_string(buyer_one.clone())]; let action = "PlaceBid".to_string(); - let permission = Permission::Local(LocalPermission::whitelisted(None)); + let permission = Permission::Local(LocalPermission::whitelisted(None, None)); auction .execute_set_permission(&mut router, owner.clone(), actors, action, permission) .unwrap(); diff --git a/tests-integration/tests/marketplace_app.rs b/tests-integration/tests/marketplace_app.rs index 90aad5cf5..e195a4dbf 100644 --- a/tests-integration/tests/marketplace_app.rs +++ b/tests-integration/tests/marketplace_app.rs @@ -202,7 +202,7 @@ fn test_marketplace_app() { &mut router, owner.clone(), vec![AndrAddr::from_string(buyer.clone())], - LocalPermission::limited(None, 1), + LocalPermission::limited(None, None, 1), ) .unwrap_err() .downcast() @@ -221,7 +221,7 @@ fn test_marketplace_app() { &mut router, owner.clone(), vec![AndrAddr::from_string(buyer.clone())], - LocalPermission::blacklisted(None), + LocalPermission::blacklisted(None, None), ) .unwrap(); @@ -255,7 +255,7 @@ fn test_marketplace_app() { &mut router, owner.clone(), vec![AndrAddr::from_string(buyer.clone())], - LocalPermission::whitelisted(None), + LocalPermission::whitelisted(None, None), ) .unwrap(); @@ -615,7 +615,7 @@ fn test_marketplace_app_cw20_restricted() { AndrAddr::from_string(buyer.clone()), AndrAddr::from_string(owner.clone()), ], - LocalPermission::whitelisted(None), + LocalPermission::whitelisted(None, None), ) .unwrap(); @@ -897,7 +897,7 @@ fn test_marketplace_app_cw20_unrestricted() { AndrAddr::from_string(buyer.clone()), AndrAddr::from_string(owner.clone()), ], - LocalPermission::whitelisted(None), + LocalPermission::whitelisted(None, None), ) .unwrap(); diff --git a/tests-integration/tests/rates_orch.rs b/tests-integration/tests/rates_orch.rs deleted file mode 100644 index 7046bb181..000000000 --- a/tests-integration/tests/rates_orch.rs +++ /dev/null @@ -1,221 +0,0 @@ -use andromeda_adodb::ADODBContract; -use andromeda_economics::EconomicsContract; -use andromeda_kernel::KernelContract; -use andromeda_marketplace::MarketplaceContract; -use andromeda_modules::rates::InstantiateMsg as RatesInstantiateMsg; -use andromeda_non_fungible_tokens::marketplace::{ - ExecuteMsg, InstantiateMsg as MarketplaceInstantiateMsg, QueryMsg, -}; -use andromeda_rates::RatesContract; -use andromeda_std::{ - ado_base::{ - rates::{AllRatesResponse, LocalRate, LocalRateType, PercentRate}, - MigrateMsg, - }, - amp::{AndrAddr, Recipient}, - os::{ - self, - kernel::{ExecuteMsg as KernelExecuteMsg, InstantiateMsg as KernelInstantiateMsg}, - }, -}; -use andromeda_vfs::VFSContract; -use cosmwasm_std::{Addr, Decimal}; -use cw_orch::prelude::*; -use cw_orch_interchain::prelude::*; - -#[test] -fn test_marketplace_migration() { - // Here `juno-1` is the chain-id and `juno` is the address prefix for this chain - let sender = Addr::unchecked("sender_for_all_chains"); - let interchain = MockInterchainEnv::new(vec![("juno", &sender.clone().into_string())]); - let juno = interchain.get_chain("juno").unwrap(); - - juno.set_balance( - sender.clone().into_string().clone(), - vec![Coin::new(100000000000000, "juno")], - ) - .unwrap(); - - let marketplace_juno = MarketplaceContract::new(juno.clone()); - let kernel_juno = KernelContract::new(juno.clone()); - let rates_juno = RatesContract::new(juno.clone()); - let vfs_juno = VFSContract::new(juno.clone()); - let adodb_juno = ADODBContract::new(juno.clone()); - let economics_juno = EconomicsContract::new(juno.clone()); - - marketplace_juno.upload().unwrap(); - kernel_juno.upload().unwrap(); - rates_juno.upload().unwrap(); - vfs_juno.upload().unwrap(); - adodb_juno.upload().unwrap(); - economics_juno.upload().unwrap(); - - let kernel_init_msg = &KernelInstantiateMsg { - owner: None, - chain_name: "juno".to_string(), - }; - kernel_juno - .instantiate(kernel_init_msg, None, None) - .unwrap(); - - vfs_juno - .instantiate( - &os::vfs::InstantiateMsg { - kernel_address: kernel_juno.address().unwrap().into_string(), - owner: None, - }, - None, - None, - ) - .unwrap(); - - kernel_juno - .execute( - &KernelExecuteMsg::UpsertKeyAddress { - key: "vfs".to_string(), - value: vfs_juno.address().unwrap().into_string(), - }, - None, - ) - .unwrap(); - - adodb_juno - .instantiate( - &os::adodb::InstantiateMsg { - kernel_address: kernel_juno.address().unwrap().into_string(), - owner: None, - }, - None, - None, - ) - .unwrap(); - - kernel_juno - .execute( - &KernelExecuteMsg::UpsertKeyAddress { - key: "adodb".to_string(), - value: adodb_juno.address().unwrap().into_string(), - }, - None, - ) - .unwrap(); - - adodb_juno - .execute( - &os::adodb::ExecuteMsg::Publish { - code_id: 3, - ado_type: "rates".to_string(), - action_fees: None, - version: "2.0.3".to_string(), - publisher: None, - }, - None, - ) - .unwrap(); - - let rates_init_msg = &RatesInstantiateMsg { - action: "Claim".to_string(), - rate: LocalRate { - rate_type: LocalRateType::Additive, - recipient: Recipient::from_string("recipient".to_string()), - value: andromeda_std::ado_base::rates::LocalRateValue::Percent(PercentRate { - percent: Decimal::one(), - }), - description: None, - }, - kernel_address: kernel_juno.address().unwrap().into_string(), - owner: Some(sender.clone().into_string().clone()), - }; - rates_juno.instantiate(rates_init_msg, None, None).unwrap(); - - kernel_juno - .execute( - &KernelExecuteMsg::UpsertKeyAddress { - key: "rates".to_string(), - value: rates_juno.address().unwrap().into_string(), - }, - None, - ) - .unwrap(); - - let marketplace_init_msg = &MarketplaceInstantiateMsg { - authorized_cw20_addresses: None, - authorized_token_addresses: None, - kernel_address: kernel_juno.address().unwrap().into_string(), - owner: Some(sender.clone().into_string().clone()), - }; - - marketplace_juno - .instantiate(marketplace_init_msg, Some(&sender), None) - .unwrap(); - - adodb_juno - .execute( - &os::adodb::ExecuteMsg::Publish { - code_id: 6, - ado_type: "economics".to_string(), - action_fees: None, - version: "1.1.1".to_string(), - publisher: None, - }, - None, - ) - .unwrap(); - - economics_juno - .instantiate( - &os::economics::InstantiateMsg { - kernel_address: kernel_juno.address().unwrap().into_string(), - owner: None, - }, - None, - None, - ) - .unwrap(); - - kernel_juno - .execute( - &KernelExecuteMsg::UpsertKeyAddress { - key: "economics".to_string(), - value: economics_juno.address().unwrap().into_string(), - }, - None, - ) - .unwrap(); - - marketplace_juno - .execute( - &ExecuteMsg::Rates(andromeda_std::ado_base::rates::RatesMessage::SetRate { - action: "Claim".to_string(), - rate: andromeda_std::ado_base::rates::Rate::Contract(AndrAddr::from_string( - rates_juno.address().unwrap().into_string(), - )), - }), - None, - ) - .unwrap(); - - marketplace_juno.upload().unwrap(); - - // Query marketplace rates - let rates_query: AllRatesResponse = marketplace_juno.query(&QueryMsg::AllRates {}).unwrap(); - assert_eq!(rates_query.all_rates.len(), 1); - - marketplace_juno.migrate(&MigrateMsg {}, 7).unwrap(); - - // Adjusting the migrate function for testing purposes will show that the code works as expected. - // Let the code in the migrate function to expect Recipient instead of Vec and the below rates query will return 0 - let rates_query: AllRatesResponse = marketplace_juno.query(&QueryMsg::AllRates {}).unwrap(); - assert_eq!(rates_query.all_rates.len(), 1); - - // vfs_juno - // .instantiate( - // &os::vfs::InstantiateMsg { - // kernel_address: kernel_juno.address().unwrap().into_string(), - // owner: None, - // }, - // None, - // None, - // ) - // .unwrap(); -} diff --git a/tests-integration/tests/validator_staking.rs b/tests-integration/tests/validator_staking.rs index ffec2c661..7275c461e 100644 --- a/tests-integration/tests/validator_staking.rs +++ b/tests-integration/tests/validator_staking.rs @@ -274,7 +274,7 @@ fn test_restake() { vec![AndrAddr::from_string(permissioned_actor.clone())], "restake".to_string(), andromeda_std::ado_base::permissioning::Permission::Local( - andromeda_std::ado_base::permissioning::LocalPermission::Whitelisted(None), + andromeda_std::ado_base::permissioning::LocalPermission::whitelisted(None, None), ), ) .unwrap();