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 {