diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ef186b9a..345e7246 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: secretdev: # Docker Hub image options: --name secretdev - image: ghcr.io/scrtlabs/localsecret:v1.6.0-alpha.4 + image: ghcr.io/scrtlabs/localsecret:v1.12.2 volumes: - "/home/runner/work/snip20-reference-impl/snip20-reference-impl/:/root/code" ports: diff --git a/Cargo.lock b/Cargo.lock index 8e3ff6b2..bb4533d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,6 +77,15 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -89,22 +98,11 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" -[[package]] -name = "cosmwasm-crypto" -version = "1.1.9" -source = "git+https://github.com/scrtlabs/cosmwasm/?tag=v1.1.9-secret#e40a15f04dae80680dbe22aef760e5eaab6b0a19" -dependencies = [ - "digest 0.10.6", - "ed25519-zebra", - "k256", - "rand_core 0.6.4", - "thiserror", -] - [[package]] name = "cosmwasm-derive" -version = "1.1.9" -source = "git+https://github.com/scrtlabs/cosmwasm/?tag=v1.1.9-secret#e40a15f04dae80680dbe22aef760e5eaab6b0a19" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" dependencies = [ "syn 1.0.109", ] @@ -133,33 +131,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "cosmwasm-std" -version = "1.1.9" -source = "git+https://github.com/scrtlabs/cosmwasm/?tag=v1.1.9-secret#e40a15f04dae80680dbe22aef760e5eaab6b0a19" -dependencies = [ - "base64 0.13.1", - "cosmwasm-crypto", - "cosmwasm-derive", - "derivative", - "forward_ref", - "hex", - "schemars", - "serde", - "serde-json-wasm", - "thiserror", - "uint", -] - -[[package]] -name = "cosmwasm-storage" -version = "1.1.9" -source = "git+https://github.com/scrtlabs/cosmwasm/?tag=v1.1.9-secret#e40a15f04dae80680dbe22aef760e5eaab6b0a19" -dependencies = [ - "cosmwasm-std", - "serde", -] - [[package]] name = "cpufeatures" version = "0.2.5" @@ -430,18 +401,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.52" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -482,13 +453,13 @@ dependencies = [ [[package]] name = "remain" -version = "0.2.7" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4b7d9b4676922ecbbad6d317e0f847762c4b28b935a2db3b44bd4f36c1aa7f" +checksum = "1ad5e011230cad274d0532460c5ab69828ea47ae75681b42a841663efffaf794" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -555,16 +526,75 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "secret-cosmwasm-crypto" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8535d61c88d0a6c222df2cebb69859d8e9ba419a299a1bc84c904b0d9c00c7b2" +dependencies = [ + "digest 0.10.6", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "secret-cosmwasm-std" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4393b01aa6587007161a6bb193859deaa8165ab06c8a35f253d329ff99e4d" +dependencies = [ + "base64 0.13.1", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "secret-cosmwasm-crypto", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "secret-cosmwasm-storage" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb43da2cb72a53b16ea1555bca794fb828b48ab24ebeb45f8e26f1881c45a783" +dependencies = [ + "secret-cosmwasm-std", + "serde", +] + [[package]] name = "secret-toolkit" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338c972c0a98de51ccbb859312eb7672bc64b9050b086f058748ba26a509edbb" dependencies = [ "secret-toolkit-crypto", "secret-toolkit-permit", "secret-toolkit-serialization", - "secret-toolkit-snip20", - "secret-toolkit-snip721", "secret-toolkit-storage", "secret-toolkit-utils", "secret-toolkit-viewing-key", @@ -572,93 +602,78 @@ dependencies = [ [[package]] name = "secret-toolkit-crypto" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003d7d5772c67f2240b7f298f96eb73a8a501916fe18c1d730ebfd591bf7e519" dependencies = [ - "cosmwasm-std", "rand_chacha", "rand_core 0.6.4", + "secp256k1", + "secret-cosmwasm-std", "sha2 0.10.6", ] [[package]] name = "secret-toolkit-permit" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4330571400b5959450fa37040609e6804a147d83f606783506bc2275f1527712" dependencies = [ "bech32", - "cosmwasm-std", "remain", "ripemd", "schemars", + "secret-cosmwasm-std", "secret-toolkit-crypto", "serde", ] [[package]] name = "secret-toolkit-serialization" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "890adaeaa710f9f7068a807eb1553edc8c30ce9907290895c9097dd642fc613b" dependencies = [ "bincode2", - "cosmwasm-std", - "schemars", - "serde", -] - -[[package]] -name = "secret-toolkit-snip20" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" -dependencies = [ - "cosmwasm-std", - "schemars", - "secret-toolkit-utils", - "serde", -] - -[[package]] -name = "secret-toolkit-snip721" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" -dependencies = [ - "cosmwasm-std", "schemars", - "secret-toolkit-utils", + "secret-cosmwasm-std", "serde", ] [[package]] name = "secret-toolkit-storage" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55e8c5418af3e7ae1d1331c383b32d56c74a340dbc3b972d53555a768698f2a3" dependencies = [ - "cosmwasm-std", - "cosmwasm-storage", + "secret-cosmwasm-std", + "secret-cosmwasm-storage", "secret-toolkit-serialization", "serde", ] [[package]] name = "secret-toolkit-utils" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f1cba2e70fd701e3dfc6072807c02eeeb9776bee49e346a9c7745d84ff40c8" dependencies = [ - "cosmwasm-std", - "cosmwasm-storage", "schemars", + "secret-cosmwasm-std", + "secret-cosmwasm-storage", "serde", ] [[package]] name = "secret-toolkit-viewing-key" -version = "0.8.0" -source = "git+https://github.com/scrtlabs/secret-toolkit?rev=9b74bdac71c2fedcc12246f18cdfdd94b8991282#9b74bdac71c2fedcc12246f18cdfdd94b8991282" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d89a0b69fa9b12735a612fa30e6e7e48130943982f1783b7ddd5c46ed09e921" dependencies = [ "base64 0.21.0", - "cosmwasm-std", - "cosmwasm-storage", "schemars", + "secret-cosmwasm-std", + "secret-cosmwasm-storage", "secret-toolkit-crypto", "secret-toolkit-utils", "serde", @@ -691,7 +706,7 @@ checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.4", + "syn 2.0.48", ] [[package]] @@ -756,10 +771,10 @@ version = "1.0.0" dependencies = [ "base64 0.21.0", "cosmwasm-schema", - "cosmwasm-std", - "cosmwasm-storage", "rand", "schemars", + "secret-cosmwasm-std", + "secret-cosmwasm-storage", "secret-toolkit", "secret-toolkit-crypto", "serde", @@ -800,9 +815,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.4" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c622ae390c9302e214c31013517c2061ecb2699935882c60a9b37f82f8625ae" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index e6435002..c4b786ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,17 +32,11 @@ backtraces = ["cosmwasm-std/backtraces"] # debug-print = ["cosmwasm-std/debug-print"] [dependencies] -cosmwasm-std = { git = "https://github.com/scrtlabs/cosmwasm/", default-features = false, tag = "v1.1.9-secret" } -cosmwasm-storage = { git = "https://github.com/scrtlabs/cosmwasm/", tag = "v1.1.9-secret" } +cosmwasm-std = { package = "secret-cosmwasm-std", version = "1.1.11" } +cosmwasm-storage = { package = "secret-cosmwasm-storage", version = "1.1.11" } rand = { version = "0.8.5", default-features = false } -secret-toolkit = { git = "https://github.com/scrtlabs/secret-toolkit", features = [ - "permit", - "viewing-key", -], rev = "9b74bdac71c2fedcc12246f18cdfdd94b8991282" } -secret-toolkit-crypto = { git = "https://github.com/scrtlabs/secret-toolkit", features = [ - "rand", - "hash", -], rev = "9b74bdac71c2fedcc12246f18cdfdd94b8991282" } +secret-toolkit = { version = "0.10.0", default-features = false, features = ["crypto", "permit", "storage", "viewing-key"] } +secret-toolkit-crypto = { version = "0.10.0", features = ["rand", "hash"] } schemars = "0.8.12" serde = { version = "1.0.158", default-features = false, features = ["derive"] } diff --git a/Makefile b/Makefile index eee79095..7b7ffc48 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ compile-optimized-reproducible: docker run --rm -v "$$(pwd)":/contract \ --mount type=volume,source="$$(basename "$$(pwd)")_cache",target=/code/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - enigmampc/secret-contract-optimizer:1.0.7 + enigmampc/secret-contract-optimizer:1.0.10 contract.wasm.gz: contract.wasm cat ./contract.wasm | gzip -9 > ./contract.wasm.gz @@ -76,7 +76,7 @@ start-server: # CTRL+C to stop docker run -it --rm \ -p 9091:9091 -p 26657:26657 -p 26656:26656 -p 1317:1317 -p 5000:5000 \ -v $$(pwd):/root/code \ - --name secretdev ghcr.io/scrtlabs/localsecret:v1.6.0-alpha.4 + --name secretdev ghcr.io/scrtlabs/localsecret:v1.12.2 .PHONY: schema schema: diff --git a/src/contract.rs b/src/contract.rs index f5f89789..3a64532b 100644 --- a/src/contract.rs +++ b/src/contract.rs @@ -8,12 +8,13 @@ use rand::RngCore; use secret_toolkit::permit::{Permit, RevokedPermits, TokenPermissions}; use secret_toolkit::utils::{pad_handle_result, pad_query_result}; use secret_toolkit::viewing_key::{ViewingKey, ViewingKeyStore}; -use secret_toolkit_crypto::{sha_256, Prng, SHA256_HASH_SIZE}; +use secret_toolkit_crypto::{sha_256, ContractPrng, SHA256_HASH_SIZE}; use crate::batch; use crate::msg::{ - AllowanceGivenResult, AllowanceReceivedResult, ContractStatusLevel, Decoyable, ExecuteAnswer, - ExecuteMsg, InstantiateMsg, QueryAnswer, QueryMsg, QueryWithPermit, ResponseStatus::Success, + AllowanceGivenResult, AllowanceReceivedResult, ContractStatusLevel, Decoyable, Evaporator, + ExecuteAnswer, ExecuteMsg, InstantiateMsg, QueryAnswer, QueryMsg, QueryWithPermit, + ResponseStatus::Success, }; use crate::receiver::Snip20ReceiveMsg; use crate::state::{ @@ -142,7 +143,7 @@ fn get_address_position( decoys_size: usize, entropy: &[u8; SHA256_HASH_SIZE], ) -> StdResult<usize> { - let mut rng = Prng::new(&PrngStore::load(store)?, entropy); + let mut rng = ContractPrng::new(&PrngStore::load(store)?, entropy); let mut new_contract_entropy = [0u8; 20]; rng.rng.fill_bytes(&mut new_contract_entropy); @@ -170,6 +171,7 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S account_random_pos = Some(get_address_position(deps.storage, decoys_size, &entropy)?); } + let api = deps.api; match contract_status { ContractStatusLevel::StopAll | ContractStatusLevel::StopAllButRedeems => { let response = match msg { @@ -373,7 +375,9 @@ pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> S } }; - pad_handle_result(response, RESPONSE_BLOCK_SIZE) + let padded_result = pad_handle_result(response, RESPONSE_BLOCK_SIZE); + msg.evaporate_to_target(api)?; + padded_result } #[entry_point] @@ -986,7 +990,7 @@ pub fn query_allowances_given( let owner = Addr::unchecked(owner); let all_allowances = - AllowancesStore::all_allowances(deps.storage, &owner, page, page_size).unwrap_or(vec![]); + AllowancesStore::all_allowances(deps.storage, &owner, page, page_size).unwrap_or_default(); let allowances_result = all_allowances .into_iter() @@ -1018,7 +1022,7 @@ pub fn query_allowances_received( let spender = Addr::unchecked(spender); let all_allowed = - AllowancesStore::all_allowed(deps.storage, &spender, page, page_size).unwrap_or(vec![]); + AllowancesStore::all_allowed(deps.storage, &spender, page, page_size).unwrap_or_default(); let allowances = all_allowed .into_iter() @@ -2349,6 +2353,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -2369,6 +2374,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -2414,6 +2420,7 @@ mod tests { memo: None, decoys: Some(vec![lior_addr.clone(), jhon_addr.clone()]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; @@ -2450,6 +2457,7 @@ mod tests { let handle_msg = ExecuteMsg::RegisterReceive { code_hash: "this_is_a_hash_of_a_code".to_string(), + gas_target: None, padding: None, }; let info = mock_info("contract", &[]); @@ -2467,6 +2475,7 @@ mod tests { padding: None, msg: Some(to_binary("hey hey you you").unwrap()), decoys: None, + gas_target: None, entropy: None, }; let info = mock_info("bob", &[]); @@ -2515,6 +2524,7 @@ mod tests { let handle_msg = ExecuteMsg::RegisterReceive { code_hash: "this_is_a_hash_of_a_code".to_string(), + gas_target: None, padding: None, }; let info = mock_info("contract", &[]); @@ -2545,6 +2555,7 @@ mod tests { let handle_msg = ExecuteMsg::CreateViewingKey { entropy: "".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -2586,6 +2597,7 @@ mod tests { // Set VK let handle_msg = ExecuteMsg::SetViewingKey { key: "hi lol".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -2606,6 +2618,7 @@ mod tests { let actual_vk = "x".to_string().repeat(VIEWING_KEY_SIZE); let handle_msg = ExecuteMsg::SetViewingKey { key: actual_vk.clone(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -2630,6 +2643,7 @@ mod tests { ) -> Result<Response, StdError> { let handle_msg = ExecuteMsg::RevokePermit { permit_name: permit_name.to_string(), + gas_target: None, padding: None, }; let info = mock_info(user_address, &[]); @@ -2839,6 +2853,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -2853,6 +2868,7 @@ mod tests { spender: "alice".to_string(), amount: Uint128::new(2000), padding: None, + gas_target: None, expiration: Some(1_571_797_420), }; let info = mock_info("bob", &[]); @@ -2871,6 +2887,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -2888,6 +2905,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; @@ -2903,8 +2921,12 @@ mod tests { height: 12_345, time: Timestamp::from_seconds(1_571_797_420), chain_id: "cosmos-testnet-14002".to_string(), + random: None, }, - transaction: Some(TransactionInfo { index: 3 }), + transaction: Some(TransactionInfo { + index: 3, + hash: "".to_string(), + }), contract: ContractInfo { address: Addr::unchecked(MOCK_CONTRACT_ADDR.to_string()), code_hash: "".to_string(), @@ -2924,6 +2946,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -2953,6 +2976,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -2985,6 +3009,7 @@ mod tests { msg: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -2999,6 +3024,7 @@ mod tests { spender: "alice".to_string(), amount: Uint128::new(2000), padding: None, + gas_target: None, expiration: None, }; let info = mock_info("bob", &[]); @@ -3019,6 +3045,7 @@ mod tests { msg: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3031,6 +3058,7 @@ mod tests { // Sanity check let handle_msg = ExecuteMsg::RegisterReceive { code_hash: "lolz".to_string(), + gas_target: None, padding: None, }; let info = mock_info("contract", &[]); @@ -3059,6 +3087,7 @@ mod tests { msg: Some(send_msg), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3098,6 +3127,7 @@ mod tests { msg: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3144,6 +3174,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3160,6 +3191,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3173,6 +3205,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -3191,6 +3224,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3207,6 +3241,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3231,6 +3266,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3293,6 +3329,7 @@ mod tests { let handle_msg = ExecuteMsg::BatchBurnFrom { actions, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3320,6 +3357,7 @@ mod tests { spender: "alice".to_string(), amount: Uint128::new(allowance_size), padding: None, + gas_target: None, expiration: None, }; let info = mock_info(*name, &[]); @@ -3336,6 +3374,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3360,6 +3399,7 @@ mod tests { let handle_msg = ExecuteMsg::BatchBurnFrom { actions, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3393,6 +3433,7 @@ mod tests { let handle_msg = ExecuteMsg::BatchBurnFrom { actions, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3425,6 +3466,7 @@ mod tests { let handle_msg = ExecuteMsg::BatchBurnFrom { actions, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -3450,6 +3492,7 @@ mod tests { let handle_msg = ExecuteMsg::DecreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -3478,6 +3521,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -3494,6 +3538,7 @@ mod tests { let handle_msg = ExecuteMsg::DecreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(50), + gas_target: None, padding: None, expiration: None, }; @@ -3532,6 +3577,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -3560,6 +3606,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: "alice".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -3597,6 +3644,7 @@ mod tests { let handle_msg = ExecuteMsg::ChangeAdmin { address: "bob".to_string(), + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -3627,6 +3675,7 @@ mod tests { let handle_msg = ExecuteMsg::SetContractStatus { level: ContractStatusLevel::StopAll, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -3699,6 +3748,7 @@ mod tests { denom: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("butler", &[]); @@ -3714,6 +3764,7 @@ mod tests { denom: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("butler", &[]); @@ -3732,6 +3783,7 @@ mod tests { denom: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("butler", &[]); @@ -3750,6 +3802,7 @@ mod tests { denom: Option::from("uscrt".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("butler", &[]); @@ -3799,6 +3852,7 @@ mod tests { let handle_msg = ExecuteMsg::Deposit { decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info( @@ -3816,6 +3870,7 @@ mod tests { let handle_msg = ExecuteMsg::Deposit { decoys: None, entropy: None, + gas_target: None, padding: None, }; @@ -3873,6 +3928,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("lebron", &[]); @@ -3889,6 +3945,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("lebron", &[]); @@ -3941,6 +3998,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -3958,6 +4016,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -3997,6 +4056,7 @@ mod tests { let pause_msg = ExecuteMsg::SetContractStatus { level: ContractStatusLevel::StopAllButRedeems, + gas_target: None, padding: None, }; let info = mock_info("not_admin", &[]); @@ -4008,6 +4068,7 @@ mod tests { let mint_msg = ExecuteMsg::AddMinters { minters: vec!["not_admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("not_admin", &[]); @@ -4019,6 +4080,7 @@ mod tests { let mint_msg = ExecuteMsg::RemoveMinters { minters: vec!["admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("not_admin", &[]); @@ -4030,6 +4092,7 @@ mod tests { let mint_msg = ExecuteMsg::SetMinters { minters: vec!["not_admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("not_admin", &[]); @@ -4041,6 +4104,7 @@ mod tests { let change_admin_msg = ExecuteMsg::ChangeAdmin { address: "not_admin".to_string(), + gas_target: None, padding: None, }; let info = mock_info("not_admin", &[]); @@ -4073,6 +4137,7 @@ mod tests { let pause_msg = ExecuteMsg::SetContractStatus { level: ContractStatusLevel::StopAllButRedeems, + gas_target: None, padding: None, }; @@ -4092,6 +4157,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4109,6 +4175,7 @@ mod tests { denom: Option::from("uscrt".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("lebron", &[]); @@ -4136,6 +4203,7 @@ mod tests { let pause_msg = ExecuteMsg::SetContractStatus { level: ContractStatusLevel::StopAll, + gas_target: None, padding: None, }; @@ -4155,6 +4223,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4172,6 +4241,7 @@ mod tests { denom: Option::from("uscrt".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("lebron", &[]); @@ -4216,6 +4286,7 @@ mod tests { // try when mint disabled let handle_msg = ExecuteMsg::SetMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4227,6 +4298,7 @@ mod tests { let handle_msg = ExecuteMsg::SetMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4238,6 +4310,7 @@ mod tests { let handle_msg = ExecuteMsg::SetMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4252,6 +4325,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4266,6 +4340,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4307,6 +4382,7 @@ mod tests { // try when mint disabled let handle_msg = ExecuteMsg::AddMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4318,6 +4394,7 @@ mod tests { let handle_msg = ExecuteMsg::AddMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4329,6 +4406,7 @@ mod tests { let handle_msg = ExecuteMsg::AddMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4343,6 +4421,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4357,6 +4436,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4397,6 +4477,7 @@ mod tests { // try when mint disabled let handle_msg = ExecuteMsg::RemoveMinters { minters: vec!["bob".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4408,6 +4489,7 @@ mod tests { let handle_msg = ExecuteMsg::RemoveMinters { minters: vec!["admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4419,6 +4501,7 @@ mod tests { let handle_msg = ExecuteMsg::RemoveMinters { minters: vec!["admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4433,6 +4516,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4448,6 +4532,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4460,6 +4545,7 @@ mod tests { // Removing another extra time to ensure nothing funky happens let handle_msg = ExecuteMsg::RemoveMinters { minters: vec!["admin".to_string()], + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4474,6 +4560,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -4489,6 +4576,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -4526,6 +4614,7 @@ mod tests { let create_vk_msg = ExecuteMsg::CreateViewingKey { entropy: "34".to_string(), + gas_target: None, padding: None, }; let info = mock_info("giannis", &[]); @@ -4932,6 +5021,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: "lebron".to_string(), amount: Uint128::new(2000), + gas_target: None, padding: None, expiration: None, }; @@ -4964,6 +5054,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: vk1.clone(), + gas_target: None, padding: None, }; let info = mock_info("lebron", &[]); @@ -4982,6 +5073,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: vk2.clone(), + gas_target: None, padding: None, }; let info = mock_info("giannis", &[]); @@ -5057,6 +5149,7 @@ mod tests { for i in 0..num_owners { let handle_msg = ExecuteMsg::SetViewingKey { key: vk.clone(), + gas_target: None, padding: None, }; let info = mock_info(format!("owner{}", i).as_str(), &[]); @@ -5079,6 +5172,7 @@ mod tests { let handle_msg = ExecuteMsg::IncreaseAllowance { spender: format!("spender{}", j), amount: Uint128::new(50), + gas_target: None, padding: None, expiration: None, }; @@ -5093,6 +5187,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: vk.clone(), + gas_target: None, padding: None, }; let info = mock_info(format!("spender{}", j).as_str(), &[]); @@ -5278,6 +5373,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5328,6 +5424,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5342,6 +5439,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5356,6 +5454,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5370,6 +5469,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5458,6 +5558,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5467,6 +5568,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "alice_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -5476,6 +5578,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "lior_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("lior", &[]); @@ -5485,6 +5588,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "banana_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("banana", &[]); @@ -5508,6 +5612,7 @@ mod tests { ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5522,6 +5627,7 @@ mod tests { memo: None, decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5668,6 +5774,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5681,6 +5788,7 @@ mod tests { memo: Some("my burn message".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5698,6 +5806,7 @@ mod tests { denom: Option::from("uscrt".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5716,6 +5825,7 @@ mod tests { memo: Some("my mint message".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -5727,6 +5837,7 @@ mod tests { let handle_msg = ExecuteMsg::Deposit { decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info( @@ -5750,6 +5861,7 @@ mod tests { memo: Some("my transfer message #1".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5765,6 +5877,7 @@ mod tests { memo: Some("my transfer message #2".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5780,6 +5893,7 @@ mod tests { memo: Some("my transfer message #3".to_string()), decoys: None, entropy: None, + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5962,6 +6076,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -5971,6 +6086,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "alice_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("alice", &[]); @@ -5980,6 +6096,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "lior_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("lior", &[]); @@ -5989,6 +6106,7 @@ mod tests { let handle_msg = ExecuteMsg::SetViewingKey { key: "jhon_key".to_string(), + gas_target: None, padding: None, }; let info = mock_info("jhon", &[]); @@ -6010,6 +6128,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -6031,6 +6150,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -6053,6 +6173,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("admin", &[]); @@ -6068,6 +6189,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info( @@ -6095,6 +6217,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -6114,6 +6237,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); @@ -6133,6 +6257,7 @@ mod tests { alice_addr.clone(), ]), entropy: Some(Binary::from_base64("VEVTVFRFU1RURVNUQ0hFQ0tDSEVDSw==").unwrap()), + gas_target: None, padding: None, }; let info = mock_info("bob", &[]); diff --git a/src/msg.rs b/src/msg.rs index cc583dd7..a563912b 100644 --- a/src/msg.rs +++ b/src/msg.rs @@ -95,11 +95,13 @@ pub enum ExecuteMsg { denom: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, Deposit { decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, @@ -110,6 +112,7 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, Send { @@ -120,16 +123,19 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchTransfer { actions: Vec<batch::TransferAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchSend { actions: Vec<batch::SendAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, Burn { @@ -137,18 +143,22 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, RegisterReceive { code_hash: String, + gas_target: Option<u32>, padding: Option<String>, }, CreateViewingKey { entropy: String, + gas_target: Option<u32>, padding: Option<String>, }, SetViewingKey { key: String, + gas_target: Option<u32>, padding: Option<String>, }, @@ -157,12 +167,14 @@ pub enum ExecuteMsg { spender: String, amount: Uint128, expiration: Option<u64>, + gas_target: Option<u32>, padding: Option<String>, }, DecreaseAllowance { spender: String, amount: Uint128, expiration: Option<u64>, + gas_target: Option<u32>, padding: Option<String>, }, TransferFrom { @@ -172,6 +184,7 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, SendFrom { @@ -183,16 +196,19 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchTransferFrom { actions: Vec<batch::TransferFromAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchSendFrom { actions: Vec<batch::SendFromAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BurnFrom { @@ -201,11 +217,13 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchBurnFrom { actions: Vec<batch::BurnFromAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, @@ -216,43 +234,57 @@ pub enum ExecuteMsg { memo: Option<String>, decoys: Option<Vec<Addr>>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, BatchMint { actions: Vec<batch::MintAction>, entropy: Option<Binary>, + gas_target: Option<u32>, padding: Option<String>, }, AddMinters { minters: Vec<String>, + gas_target: Option<u32>, padding: Option<String>, }, RemoveMinters { minters: Vec<String>, + gas_target: Option<u32>, padding: Option<String>, }, SetMinters { minters: Vec<String>, + gas_target: Option<u32>, padding: Option<String>, }, // Admin ChangeAdmin { address: String, + gas_target: Option<u32>, padding: Option<String>, }, SetContractStatus { level: ContractStatusLevel, + gas_target: Option<u32>, padding: Option<String>, }, /// Add deposit/redeem support for these coin denoms - AddSupportedDenoms { denoms: Vec<String> }, + AddSupportedDenoms { + denoms: Vec<String>, + gas_target: Option<u32>, + }, /// Remove deposit/redeem support for these coin denoms - RemoveSupportedDenoms { denoms: Vec<String> }, + RemoveSupportedDenoms { + denoms: Vec<String>, + gas_target: Option<u32>, + }, // Permit RevokePermit { permit_name: String, + gas_target: Option<u32>, padding: Option<String>, }, } @@ -329,6 +361,55 @@ fn get_min_decoys_count<T: HasDecoy>(actions: &[T]) -> usize { } } +pub trait Evaporator { + fn evaporate_to_target(&self, api: &dyn Api) -> StdResult<()>; +} + +impl Evaporator for ExecuteMsg { + fn evaporate_to_target(&self, api: &dyn Api) -> StdResult<()> { + match self { + ExecuteMsg::Redeem { gas_target, .. } + | ExecuteMsg::Deposit { gas_target, .. } + | ExecuteMsg::Transfer { gas_target, .. } + | ExecuteMsg::Send { gas_target, .. } + | ExecuteMsg::BatchTransfer { gas_target, .. } + | ExecuteMsg::BatchSend { gas_target, .. } + | ExecuteMsg::Burn { gas_target, .. } + | ExecuteMsg::RegisterReceive { gas_target, .. } + | ExecuteMsg::CreateViewingKey { gas_target, .. } + | ExecuteMsg::SetViewingKey { gas_target, .. } + | ExecuteMsg::IncreaseAllowance { gas_target, .. } + | ExecuteMsg::DecreaseAllowance { gas_target, .. } + | ExecuteMsg::TransferFrom { gas_target, .. } + | ExecuteMsg::SendFrom { gas_target, .. } + | ExecuteMsg::BatchTransferFrom { gas_target, .. } + | ExecuteMsg::BatchSendFrom { gas_target, .. } + | ExecuteMsg::BurnFrom { gas_target, .. } + | ExecuteMsg::BatchBurnFrom { gas_target, .. } + | ExecuteMsg::Mint { gas_target, .. } + | ExecuteMsg::BatchMint { gas_target, .. } + | ExecuteMsg::AddMinters { gas_target, .. } + | ExecuteMsg::RemoveMinters { gas_target, .. } + | ExecuteMsg::SetMinters { gas_target, .. } + | ExecuteMsg::ChangeAdmin { gas_target, .. } + | ExecuteMsg::SetContractStatus { gas_target, .. } + | ExecuteMsg::AddSupportedDenoms { gas_target, .. } + | ExecuteMsg::RemoveSupportedDenoms { gas_target, .. } + | ExecuteMsg::RevokePermit { gas_target, .. } => match gas_target { + Some(gas_target) => { + let gas_used = api.check_gas()? as u32; + if gas_used < *gas_target { + let evaporate_amount = gas_target - gas_used; + api.gas_evaporate(evaporate_amount)?; + } + Ok(()) + } + None => Ok(()), + }, + } + } +} + #[derive(Serialize, Deserialize, JsonSchema, Debug)] #[serde(rename_all = "snake_case")] pub enum ExecuteAnswer {