Repository: public-awesome/launchpad
Pull request #725 (2025-03-07 15:24:22)

main>initia


Patch:
diff --git a/Cargo.lock b/Cargo.lock
index bf088517..5bcf8ede 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -459,7 +459,7 @@ dependencies = [
 
 [[package]]
 name = "base-factory"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -477,7 +477,7 @@ dependencies = [
 
 [[package]]
 name = "base-minter"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "base-factory",
  "cosmwasm-schema 1.5.10",
@@ -1718,7 +1718,7 @@ checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35"
 
 [[package]]
 name = "e2e"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "assert_matches",
  "cosm-orc",
@@ -1981,7 +1981,7 @@ dependencies = [
 
 [[package]]
 name = "ethereum-verify"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -3057,7 +3057,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
 
 [[package]]
 name = "open-edition-factory"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "base-factory",
  "cosmwasm-schema 1.5.10",
@@ -3076,7 +3076,7 @@ dependencies = [
 
 [[package]]
 name = "open-edition-minter"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -3101,7 +3101,7 @@ dependencies = [
 
 [[package]]
 name = "open-edition-minter-merkle-wl"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -3127,7 +3127,7 @@ dependencies = [
 
 [[package]]
 name = "open-edition-minter-wl-flex"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4171,7 +4171,7 @@ dependencies = [
 
 [[package]]
 name = "sg-controllers"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4185,7 +4185,7 @@ dependencies = [
 
 [[package]]
 name = "sg-eth-airdrop"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "anyhow",
  "async-std",
@@ -4219,7 +4219,7 @@ dependencies = [
 
 [[package]]
 name = "sg-metadata"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "schemars",
@@ -4228,7 +4228,7 @@ dependencies = [
 
 [[package]]
 name = "sg-mint-hooks"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4253,7 +4253,7 @@ dependencies = [
 
 [[package]]
 name = "sg-splits"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4272,7 +4272,7 @@ dependencies = [
 
 [[package]]
 name = "sg-tiered-whitelist"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4289,7 +4289,7 @@ dependencies = [
 
 [[package]]
 name = "sg-tiered-whitelist-flex"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4306,11 +4306,11 @@ dependencies = [
 
 [[package]]
 name = "sg-utils"
-version = "3.15.0"
+version = "3.16.0"
 
 [[package]]
 name = "sg-whitelist"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4327,7 +4327,7 @@ dependencies = [
 
 [[package]]
 name = "sg-whitelist-flex"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4344,7 +4344,7 @@ dependencies = [
 
 [[package]]
 name = "sg1"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "anybuf",
  "cosmwasm-std 1.5.10",
@@ -4356,7 +4356,7 @@ dependencies = [
 
 [[package]]
 name = "sg2"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4370,7 +4370,7 @@ dependencies = [
 
 [[package]]
 name = "sg4"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4381,7 +4381,7 @@ dependencies = [
 
 [[package]]
 name = "sg721"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4395,7 +4395,7 @@ dependencies = [
 
 [[package]]
 name = "sg721-base"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4414,7 +4414,7 @@ dependencies = [
 
 [[package]]
 name = "sg721-metadata-onchain"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4433,7 +4433,7 @@ dependencies = [
 
 [[package]]
 name = "sg721-nt"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4450,7 +4450,7 @@ dependencies = [
 
 [[package]]
 name = "sg721-updatable"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -4833,7 +4833,7 @@ dependencies = [
 
 [[package]]
 name = "test-suite"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "anybuf",
  "anyhow",
@@ -4926,7 +4926,7 @@ dependencies = [
 
 [[package]]
 name = "tiered-whitelist-merkletree"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "blake3",
  "cosmwasm-schema 1.5.10",
@@ -5013,7 +5013,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "token-merge-factory"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "base-factory",
  "cosmwasm-schema 1.5.10",
@@ -5032,7 +5032,7 @@ dependencies = [
 
 [[package]]
 name = "token-merge-minter"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5360,7 +5360,7 @@ checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2"
 
 [[package]]
 name = "vending-factory"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "base-factory",
  "cosmwasm-schema 1.5.10",
@@ -5380,7 +5380,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5408,7 +5408,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter-featured"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5436,7 +5436,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter-merkle-wl"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5465,7 +5465,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter-merkle-wl-featured"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5494,7 +5494,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter-wl-flex"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5522,7 +5522,7 @@ dependencies = [
 
 [[package]]
 name = "vending-minter-wl-flex-featured"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5681,7 +5681,7 @@ dependencies = [
 
 [[package]]
 name = "whitelist-immutable"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
@@ -5698,7 +5698,7 @@ dependencies = [
 
 [[package]]
 name = "whitelist-mtree"
-version = "3.15.0"
+version = "3.16.0"
 dependencies = [
  "cosmwasm-schema 1.5.10",
  "cosmwasm-std 1.5.10",
diff --git a/Cargo.toml b/Cargo.toml
index 2a270a9b..8c9bb969 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,7 +12,7 @@ members = [
 resolver = "2"
 
 [workspace.package]
-version      = "3.15.0"
+version      = "3.16.0"
 rust-version = "1.81.0"
 edition      = "2021"
 homepage     = "https://stargaze.zone"
diff --git a/contracts/collections/sg721-updatable/src/contract.rs b/contracts/collections/sg721-updatable/src/contract.rs
index 4bc4e4cb..64d98688 100644
--- a/contracts/collections/sg721-updatable/src/contract.rs
+++ b/contracts/collections/sg721-updatable/src/contract.rs
@@ -50,7 +50,7 @@ pub fn _instantiate(
 
 pub fn execute_enable_updatable(
     deps: DepsMut,
-    _env: Env,
+    env: Env,
     info: MessageInfo,
 ) -> Result<Response, ContractError> {
     let enable_updates = ENABLE_UPDATABLE.load(deps.storage)?;
@@ -67,7 +67,7 @@ pub fn execute_enable_updatable(
     }
 
     // Check fee matches enable updatable fee and add fairburn msg
-    checked_fair_burn(&info, ENABLE_UPDATABLE_FEE, None, &mut res)?;
+    checked_fair_burn(&info, &env, ENABLE_UPDATABLE_FEE, None, &mut res)?;
 
     ENABLE_UPDATABLE.save(deps.storage, &true)?;
 
diff --git a/contracts/factories/base-factory/src/contract.rs b/contracts/factories/base-factory/src/contract.rs
index 5486f913..3b1b3413 100644
--- a/contracts/factories/base-factory/src/contract.rs
+++ b/contracts/factories/base-factory/src/contract.rs
@@ -53,7 +53,7 @@ pub fn execute(
 
 pub fn execute_create_minter(
     deps: DepsMut,
-    _env: Env,
+    env: Env,
     info: MessageInfo,
     msg: BaseMinterCreateMsg,
 ) -> Result<Response, ContractError> {
@@ -65,7 +65,13 @@ pub fn execute_create_minter(
 
     let mut res = Response::new();
     if params.creation_fee.denom == NATIVE_DENOM {
-        checked_fair_burn(&info, params.creation_fee.amount.u128(), None, &mut res)?;
+        checked_fair_burn(
+            &info,
+            &env,
+            params.creation_fee.amount.u128(),
+            None,
+            &mut res,
+        )?;
     } else {
         transfer_funds_to_launchpad_dao(
             &info,
diff --git a/contracts/factories/open-edition-factory/src/contract.rs b/contracts/factories/open-edition-factory/src/contract.rs
index 8209f4b4..000e30c5 100644
--- a/contracts/factories/open-edition-factory/src/contract.rs
+++ b/contracts/factories/open-edition-factory/src/contract.rs
@@ -70,7 +70,13 @@ pub fn execute_create_minter(
 
     let mut res = Response::new();
     if params.creation_fee.denom == NATIVE_DENOM {
-        checked_fair_burn(&info, params.creation_fee.amount.u128(), None, &mut res)?;
+        checked_fair_burn(
+            &info,
+            &env,
+            params.creation_fee.amount.u128(),
+            None,
+            &mut res,
+        )?;
     } else {
         transfer_funds_to_launchpad_dao(
             &info,
diff --git a/contracts/factories/token-merge-factory/src/contract.rs b/contracts/factories/token-merge-factory/src/contract.rs
index b21a0288..3c008632 100644
--- a/contracts/factories/token-merge-factory/src/contract.rs
+++ b/contracts/factories/token-merge-factory/src/contract.rs
@@ -51,7 +51,7 @@ pub fn execute(
 
 pub fn execute_create_minter(
     deps: DepsMut,
-    _env: Env,
+    env: Env,
     info: MessageInfo,
     msg: TokenMergeMinterCreateMsg,
 ) -> Result<Response, ContractError> {
@@ -68,7 +68,13 @@ pub fn execute_create_minter(
 
     let mut res = Response::new();
     if params.creation_fee.denom == NATIVE_DENOM {
-        checked_fair_burn(&info, params.creation_fee.amount.u128(), None, &mut res)?;
+        checked_fair_burn(
+            &info,
+            &env,
+            params.creation_fee.amount.u128(),
+            None,
+            &mut res,
+        )?;
     } else {
         transfer_funds_to_launchpad_dao(
             &info,
diff --git a/contracts/factories/vending-factory/src/contract.rs b/contracts/factories/vending-factory/src/contract.rs
index e8683ee0..798a70c8 100644
--- a/contracts/factories/vending-factory/src/contract.rs
+++ b/contracts/factories/vending-factory/src/contract.rs
@@ -53,7 +53,7 @@ pub fn execute(
 
 pub fn execute_create_minter(
     deps: DepsMut,
-    _env: Env,
+    env: Env,
     info: MessageInfo,
     msg: VendingMinterCreateMsg,
 ) -> Result<Response, ContractError> {
@@ -65,7 +65,13 @@ pub fn execute_create_minter(
 
     let mut res = Response::new();
     if params.creation_fee.denom == NATIVE_DENOM {
-        checked_fair_burn(&info, params.creation_fee.amount.u128(), None, &mut res)?;
+        checked_fair_burn(
+            &info,
+            &env,
+            params.creation_fee.amount.u128(),
+            None,
+            &mut res,
+        )?;
     } else {
         transfer_funds_to_launchpad_dao(
             &info,
diff --git a/contracts/minters/base-minter/src/contract.rs b/contracts/minters/base-minter/src/contract.rs
index 23032740..c090f723 100644
--- a/contracts/minters/base-minter/src/contract.rs
+++ b/contracts/minters/base-minter/src/contract.rs
@@ -102,7 +102,7 @@ pub fn execute(
     msg: ExecuteMsg,
 ) -> Result<Response, ContractError> {
     match msg {
-        ExecuteMsg::Mint { token_uri } => execute_mint_sender(deps, info, token_uri),
+        ExecuteMsg::Mint { token_uri } => execute_mint_sender(deps, env, info, token_uri),
         ExecuteMsg::UpdateStartTradingTime(time) => {
             execute_update_start_trading_time(deps, env, info, time)
         }
@@ -111,6 +111,7 @@ pub fn execute(
 
 pub fn execute_mint_sender(
     deps: DepsMut,
+    env: Env,
     info: MessageInfo,
     token_uri: String,
 ) -> Result<Response, ContractError> {
@@ -149,7 +150,7 @@ pub fn execute_mint_sender(
     if network_fee != funds_sent {
         return Err(ContractError::InvalidMintPrice {});
     }
-    checked_fair_burn(&info, network_fee.u128(), None, &mut res)?;
+    checked_fair_burn(&info, &env, network_fee.u128(), None, &mut res)?;
 
     // Create mint msgs
     let mint_msg = Sg721ExecuteMsg::<Extension, Empty>::Mint {
diff --git a/contracts/minters/open-edition-minter-merkle-wl/src/contract.rs b/contracts/minters/open-edition-minter-merkle-wl/src/contract.rs
index eed5d619..b6a0be67 100644
--- a/contracts/minters/open-edition-minter-merkle-wl/src/contract.rs
+++ b/contracts/minters/open-edition-minter-merkle-wl/src/contract.rs
@@ -5,10 +5,10 @@ use crate::msg::{
     MintableNumTokensResponse, QueryMsg, StartTimeResponse, TotalMintCountResponse,
 };
 use crate::state::{
-    increment_token_index, Config, ConfigExtension, CONFIG, MINTABLE_NUM_TOKENS, MINTER_ADDRS,
-    SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS, WHITELIST_FS_MINT_COUNT,
-    WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS, WHITELIST_SS_MINT_COUNT,
-    WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
+    increment_token_index, Config, ConfigExtension, AIRDROP_COUNT, CONFIG, MINTABLE_NUM_TOKENS,
+    MINTER_ADDRS, SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS,
+    WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
+    WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
 };
 #[cfg(not(feature = "library"))]
 use cosmwasm_std::entry_point;
@@ -613,6 +613,12 @@ fn _execute_mint(
         },
     )?;
 
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     // Update mintable count (optional)
     if let Some(mintable_nb_tokens) = mintable_num_tokens {
         MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_nb_tokens - 1))?;
diff --git a/contracts/minters/open-edition-minter-merkle-wl/src/state.rs b/contracts/minters/open-edition-minter-merkle-wl/src/state.rs
index 29472ae5..b0e31cd4 100644
--- a/contracts/minters/open-edition-minter-merkle-wl/src/state.rs
+++ b/contracts/minters/open-edition-minter-merkle-wl/src/state.rs
@@ -32,7 +32,7 @@ pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
 /// This keeps track of the mint count
 pub const TOTAL_MINT_COUNT: Item<u32> = Item::new("total_mint_count");
-
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const MINTABLE_NUM_TOKENS: Item<u32> = Item::new("mintable_num_tokens");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/open-edition-minter-wl-flex/src/contract.rs b/contracts/minters/open-edition-minter-wl-flex/src/contract.rs
index faa2c69e..9fc98865 100644
--- a/contracts/minters/open-edition-minter-wl-flex/src/contract.rs
+++ b/contracts/minters/open-edition-minter-wl-flex/src/contract.rs
@@ -5,10 +5,10 @@ use crate::msg::{
     MintableNumTokensResponse, QueryMsg, StartTimeResponse, TotalMintCountResponse,
 };
 use crate::state::{
-    increment_token_index, Config, ConfigExtension, CONFIG, MINTABLE_NUM_TOKENS, MINTER_ADDRS,
-    SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS, WHITELIST_FS_MINT_COUNT,
-    WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS, WHITELIST_SS_MINT_COUNT,
-    WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
+    increment_token_index, Config, ConfigExtension, AIRDROP_COUNT, CONFIG, MINTABLE_NUM_TOKENS,
+    MINTER_ADDRS, SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS,
+    WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
+    WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
 };
 #[cfg(not(feature = "library"))]
 use cosmwasm_std::entry_point;
@@ -688,6 +688,12 @@ fn _execute_mint(
         },
     )?;
 
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     // Update mintable count (optional)
     if let Some(mintable_nb_tokens) = mintable_num_tokens {
         MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_nb_tokens - 1))?;
diff --git a/contracts/minters/open-edition-minter-wl-flex/src/state.rs b/contracts/minters/open-edition-minter-wl-flex/src/state.rs
index 6d4dc37a..0a821302 100644
--- a/contracts/minters/open-edition-minter-wl-flex/src/state.rs
+++ b/contracts/minters/open-edition-minter-wl-flex/src/state.rs
@@ -34,6 +34,7 @@ pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
 
 /// This keeps track of the mint count
 pub const TOTAL_MINT_COUNT: Item<u32> = Item::new("total_mint_count");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 
 pub const MINTABLE_NUM_TOKENS: Item<u32> = Item::new("mintable_num_tokens");
 
diff --git a/contracts/minters/open-edition-minter/src/contract.rs b/contracts/minters/open-edition-minter/src/contract.rs
index dfd09069..c07b720b 100644
--- a/contracts/minters/open-edition-minter/src/contract.rs
+++ b/contracts/minters/open-edition-minter/src/contract.rs
@@ -5,10 +5,10 @@ use crate::msg::{
     MintableNumTokensResponse, QueryMsg, StartTimeResponse, TotalMintCountResponse,
 };
 use crate::state::{
-    increment_token_index, Config, ConfigExtension, CONFIG, MINTABLE_NUM_TOKENS, MINTER_ADDRS,
-    SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS, WHITELIST_FS_MINT_COUNT,
-    WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS, WHITELIST_SS_MINT_COUNT,
-    WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
+    increment_token_index, Config, ConfigExtension, AIRDROP_COUNT, CONFIG, MINTABLE_NUM_TOKENS,
+    MINTER_ADDRS, SG721_ADDRESS, STATUS, TOTAL_MINT_COUNT, WHITELIST_FS_MINTER_ADDRS,
+    WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
+    WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
 };
 #[cfg(not(feature = "library"))]
 use cosmwasm_std::entry_point;
@@ -674,6 +674,12 @@ fn _execute_mint(
         },
     )?;
 
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     // Update mintable count (optional)
     if let Some(mintable_nb_tokens) = mintable_num_tokens {
         MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_nb_tokens - 1))?;
diff --git a/contracts/minters/open-edition-minter/src/state.rs b/contracts/minters/open-edition-minter/src/state.rs
index a40e816a..5242c4b6 100644
--- a/contracts/minters/open-edition-minter/src/state.rs
+++ b/contracts/minters/open-edition-minter/src/state.rs
@@ -34,6 +34,8 @@ pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
 /// This keeps track of the mint count
 pub const TOTAL_MINT_COUNT: Item<u32> = Item::new("total_mint_count");
 
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
+
 pub const MINTABLE_NUM_TOKENS: Item<u32> = Item::new("mintable_num_tokens");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/token-merge-minter/src/contract.rs b/contracts/minters/token-merge-minter/src/contract.rs
index 435ff963..47dc682e 100644
--- a/contracts/minters/token-merge-minter/src/contract.rs
+++ b/contracts/minters/token-merge-minter/src/contract.rs
@@ -352,6 +352,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.shuffle_fee.amount.u128(),
         None,
         &mut res,
diff --git a/contracts/minters/vending-minter-featured/src/contract.rs b/contracts/minters/vending-minter-featured/src/contract.rs
index 6670515c..dd43d886 100644
--- a/contracts/minters/vending-minter-featured/src/contract.rs
+++ b/contracts/minters/vending-minter-featured/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -370,6 +370,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -742,6 +743,13 @@ fn _execute_mint(
     let mintable_num_tokens = MINTABLE_NUM_TOKENS.load(deps.storage)?;
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
+
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     // Save the new mint count for the sender's address
     if is_public {
         let new_mint_count = mint_count(deps.as_ref(), &info)? + 1;
diff --git a/contracts/minters/vending-minter-featured/src/state.rs b/contracts/minters/vending-minter-featured/src/state.rs
index 20588053..5abef904 100644
--- a/contracts/minters/vending-minter-featured/src/state.rs
+++ b/contracts/minters/vending-minter-featured/src/state.rs
@@ -31,6 +31,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/vending-minter-merkle-wl-featured/src/contract.rs b/contracts/minters/vending-minter-merkle-wl-featured/src/contract.rs
index 7e38511d..3fca11af 100644
--- a/contracts/minters/vending-minter-merkle-wl-featured/src/contract.rs
+++ b/contracts/minters/vending-minter-merkle-wl-featured/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -372,6 +372,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -780,6 +781,12 @@ fn _execute_mint(
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
 
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     if is_public {
         let new_mint_count = mint_count(deps.as_ref(), &info)? + 1;
         MINTER_ADDRS.save(deps.storage, &info.sender, &new_mint_count)?;
diff --git a/contracts/minters/vending-minter-merkle-wl-featured/src/state.rs b/contracts/minters/vending-minter-merkle-wl-featured/src/state.rs
index 20588053..5abef904 100644
--- a/contracts/minters/vending-minter-merkle-wl-featured/src/state.rs
+++ b/contracts/minters/vending-minter-merkle-wl-featured/src/state.rs
@@ -31,6 +31,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/vending-minter-merkle-wl/src/contract.rs b/contracts/minters/vending-minter-merkle-wl/src/contract.rs
index 70daa93e..a98898df 100644
--- a/contracts/minters/vending-minter-merkle-wl/src/contract.rs
+++ b/contracts/minters/vending-minter-merkle-wl/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -371,6 +371,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -778,6 +779,13 @@ fn _execute_mint(
     let mintable_num_tokens = MINTABLE_NUM_TOKENS.load(deps.storage)?;
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
+
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     if is_public {
         let new_mint_count = mint_count(deps.as_ref(), &info)? + 1;
         MINTER_ADDRS.save(deps.storage, &info.sender, &new_mint_count)?;
diff --git a/contracts/minters/vending-minter-merkle-wl/src/state.rs b/contracts/minters/vending-minter-merkle-wl/src/state.rs
index 20588053..5abef904 100644
--- a/contracts/minters/vending-minter-merkle-wl/src/state.rs
+++ b/contracts/minters/vending-minter-merkle-wl/src/state.rs
@@ -31,6 +31,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/vending-minter-wl-flex-featured/src/contract.rs b/contracts/minters/vending-minter-wl-flex-featured/src/contract.rs
index 48a17920..a041b3cf 100644
--- a/contracts/minters/vending-minter-wl-flex-featured/src/contract.rs
+++ b/contracts/minters/vending-minter-wl-flex-featured/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -358,6 +358,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -727,6 +728,13 @@ fn _execute_mint(
     let mintable_num_tokens = MINTABLE_NUM_TOKENS.load(deps.storage)?;
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
+
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     if is_public {
         // Save the new mint count for the sender's address
         let new_mint_count = public_mint_count(deps.as_ref(), &info)? + 1;
diff --git a/contracts/minters/vending-minter-wl-flex-featured/src/state.rs b/contracts/minters/vending-minter-wl-flex-featured/src/state.rs
index 20588053..5abef904 100644
--- a/contracts/minters/vending-minter-wl-flex-featured/src/state.rs
+++ b/contracts/minters/vending-minter-wl-flex-featured/src/state.rs
@@ -31,6 +31,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/vending-minter-wl-flex/src/contract.rs b/contracts/minters/vending-minter-wl-flex/src/contract.rs
index cd34282f..67dc5029 100644
--- a/contracts/minters/vending-minter-wl-flex/src/contract.rs
+++ b/contracts/minters/vending-minter-wl-flex/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -359,6 +359,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -727,6 +728,13 @@ fn _execute_mint(
     let mintable_num_tokens = MINTABLE_NUM_TOKENS.load(deps.storage)?;
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
+
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     if is_public {
         // Save the new mint count for the sender's address
         let new_mint_count = public_mint_count(deps.as_ref(), &info)? + 1;
diff --git a/contracts/minters/vending-minter-wl-flex/src/state.rs b/contracts/minters/vending-minter-wl-flex/src/state.rs
index 20588053..5abef904 100644
--- a/contracts/minters/vending-minter-wl-flex/src/state.rs
+++ b/contracts/minters/vending-minter-wl-flex/src/state.rs
@@ -31,6 +31,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
 /// Holds the status of the minter. Can be changed with on-chain governance proposals.
diff --git a/contracts/minters/vending-minter/src/contract.rs b/contracts/minters/vending-minter/src/contract.rs
index 76780b4c..548217b1 100644
--- a/contracts/minters/vending-minter/src/contract.rs
+++ b/contracts/minters/vending-minter/src/contract.rs
@@ -4,7 +4,7 @@ use crate::msg::{
     QueryMsg, StartTimeResponse,
 };
 use crate::state::{
-    Config, ConfigExtension, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
+    Config, ConfigExtension, AIRDROP_COUNT, CONFIG, LAST_DISCOUNT_TIME, MINTABLE_NUM_TOKENS,
     MINTABLE_TOKEN_POSITIONS, MINTER_ADDRS, SG721_ADDRESS, STATUS, WHITELIST_FS_MINTER_ADDRS,
     WHITELIST_FS_MINT_COUNT, WHITELIST_MINTER_ADDRS, WHITELIST_SS_MINTER_ADDRS,
     WHITELIST_SS_MINT_COUNT, WHITELIST_TS_MINTER_ADDRS, WHITELIST_TS_MINT_COUNT,
@@ -367,6 +367,7 @@ pub fn execute_shuffle(
     // Check exact shuffle fee payment included in message
     checked_fair_burn(
         &info,
+        &env,
         factory_params.extension.shuffle_fee.amount.u128(),
         None,
         &mut res,
@@ -739,6 +740,13 @@ fn _execute_mint(
     let mintable_num_tokens = MINTABLE_NUM_TOKENS.load(deps.storage)?;
     // Decrement mintable num tokens
     MINTABLE_NUM_TOKENS.save(deps.storage, &(mintable_num_tokens - 1))?;
+
+    // Update the airdrop count if is_admin
+    if is_admin {
+        let current_airdrop_count = AIRDROP_COUNT.may_load(deps.storage)?.unwrap_or(0);
+        AIRDROP_COUNT.save(deps.storage, &(current_airdrop_count + 1))?;
+    }
+
     // Save the new mint count for the sender's address
     if is_public {
         let new_mint_count = mint_count(deps.as_ref(), &info)? + 1;
diff --git a/contracts/minters/vending-minter/src/state.rs b/contracts/minters/vending-minter/src/state.rs
index 1c5ce00b..9d68587d 100644
--- a/contracts/minters/vending-minter/src/state.rs
+++ b/contracts/minters/vending-minter/src/state.rs
@@ -32,6 +32,7 @@ pub const WHITELIST_TS_MINTER_ADDRS: Map<&Addr, u32> = Map::new("wltsma");
 pub const WHITELIST_FS_MINT_COUNT: Item<u32> = Item::new("wlfsmc");
 pub const WHITELIST_SS_MINT_COUNT: Item<u32> = Item::new("wlssmc");
 pub const WHITELIST_TS_MINT_COUNT: Item<u32> = Item::new("wltsmc");
+pub const AIRDROP_COUNT: Item<u32> = Item::new("airdrop_count");
 
 pub const LAST_DISCOUNT_TIME: Item<Timestamp> = Item::new("last_discount_time");
 
diff --git a/contracts/whitelists/tiered-whitelist-flex/src/contract.rs b/contracts/whitelists/tiered-whitelist-flex/src/contract.rs
index f07aef48..36b6bd3f 100644
--- a/contracts/whitelists/tiered-whitelist-flex/src/contract.rs
+++ b/contracts/whitelists/tiered-whitelist-flex/src/contract.rs
@@ -96,7 +96,7 @@ pub fn instantiate(
     ADMIN_LIST.save(deps.storage, &admin_config)?;
 
     let mut res = Response::new();
-    checked_fair_burn(&info, creation_fee, None, &mut res)?;
+    checked_fair_burn(&info, &env, creation_fee, None, &mut res)?;
 
     if config.member_limit < config.num_members {
         return Err(ContractError::MembersExceeded {
@@ -143,7 +143,7 @@ pub fn execute(
         ExecuteMsg::AddMembers(msg) => execute_add_members(deps, env, info, msg),
         ExecuteMsg::RemoveMembers(msg) => execute_remove_members(deps, env, info, msg),
         ExecuteMsg::IncreaseMemberLimit(member_limit) => {
-            execute_increase_member_limit(deps, info, member_limit)
+            execute_increase_member_limit(deps, env, info, member_limit)
         }
         ExecuteMsg::UpdateAdmins { admins } => execute_update_admins(deps, env, info, admins),
         ExecuteMsg::Freeze {} => execute_freeze(deps, env, info),
@@ -359,6 +359,7 @@ pub fn execute_remove_stage(
 /// Increase member limit. Must include a fee if crossing 1000, 2000, etc member limit.
 pub fn execute_increase_member_limit(
     deps: DepsMut,
+    env: Env,
     info: MessageInfo,
     member_limit: u32,
 ) -> Result<Response, ContractError> {
@@ -389,7 +390,7 @@ pub fn execute_increase_member_limit(
 
     let mut res = Response::new();
     if upgrade_fee > 0 {
-        checked_fair_burn(&info, upgrade_fee, None, &mut res)?
+        checked_fair_burn(&info, &env, upgrade_fee, None, &mut res)?
     }
 
     config.member_limit = member_limit;
diff --git a/contracts/whitelists/tiered-whitelist-merkletree/src/contract.rs b/contracts/whitelists/tiered-whitelist-merkletree/src/contract.rs
index 6ed90cc5..7195655b 100644
--- a/contracts/whitelists/tiered-whitelist-merkletree/src/contract.rs
+++ b/contracts/whitelists/tiered-whitelist-merkletree/src/contract.rs
@@ -63,7 +63,7 @@ pub fn instantiate(
     validate_stages(&env, &msg.stages)?;
 
     let mut res = Response::new();
-    checked_fair_burn(&info, CREATION_FEE, None, &mut res)?;
+    checked_fair_burn(&info, &env, CREATION_FEE, None, &mut res)?;
 
     let config = Config { stages: msg.stages };
 
diff --git a/contracts/whitelists/tiered-whitelist/src/contract.rs b/contracts/whitelists/tiered-whitelist/src/contract.rs
index e2614faa..9605d72b 100644
--- a/contracts/whitelists/tiered-whitelist/src/contract.rs
+++ b/contracts/whitelists/tiered-whitelist/src/contract.rs
@@ -94,7 +94,7 @@ pub fn instantiate(
     ADMIN_LIST.save(deps.storage, &admin_config)?;
 
     let mut res = Response::new();
-    checked_fair_burn(&info, creation_fee, None, &mut res)?;
+    checked_fair_burn(&info, &env, creation_fee, None, &mut res)?;
 
     if config.member_limit < config.num_members {
         return Err(ContractError::MembersExceeded {
@@ -136,7 +136,7 @@ pub fn execute(
         ExecuteMsg::AddMembers(msg) => execute_add_members(deps, env, info, msg),
         ExecuteMsg::RemoveMembers(msg) => execute_remove_members(deps, env, info, msg),
         ExecuteMsg::IncreaseMemberLimit(member_limit) => {
-            execute_increase_member_limit(deps, info, member_limit)
+            execute_increase_member_limit(deps, env, info, member_limit)
         }
         ExecuteMsg::UpdateAdmins { admins } => execute_update_admins(deps, env, info, admins),
         ExecuteMsg::Freeze {} => execute_freeze(deps, env, info),
@@ -359,6 +359,7 @@ pub fn execute_remove_stage(
 /// Increase member limit. Must include a fee if crossing 1000, 2000, etc member limit.
 pub fn execute_increase_member_limit(
     deps: DepsMut,
+    env: Env,
     info: MessageInfo,
     member_limit: u32,
 ) -> Result<Response, ContractError> {
@@ -389,7 +390,7 @@ pub fn execute_increase_member_limit(
 
     let mut res = Response::new();
     if upgrade_fee > 0 {
-        checked_fair_burn(&info, upgrade_fee, None, &mut res)?
+        checked_fair_burn(&info, &env, upgrade_fee, None, &mut res)?
     }
 
     config.member_limit = member_limit;
diff --git a/contracts/whitelists/whitelist-flex/src/contract.rs b/contracts/whitelists/whitelist-flex/src/contract.rs
index ad141d1a..060722bd 100644
--- a/contracts/whitelists/whitelist-flex/src/contract.rs
+++ b/contracts/whitelists/whitelist-flex/src/contract.rs
@@ -112,7 +112,7 @@ pub fn instantiate(
     }
 
     let mut res = Response::new();
-    checked_fair_burn(&info, creation_fee, None, &mut res)?;
+    checked_fair_burn(&info, &env, creation_fee, None, &mut res)?;
 
     if config.member_limit < config.num_members {
         return Err(ContractError::MembersExceeded {
@@ -151,7 +151,7 @@ pub fn execute(
         ExecuteMsg::AddMembers(msg) => execute_add_members(deps, env, info, msg),
         ExecuteMsg::RemoveMembers(msg) => execute_remove_members(deps, env, info, msg),
         ExecuteMsg::IncreaseMemberLimit(member_limit) => {
-            execute_increase_member_limit(deps, info, member_limit)
+            execute_increase_member_limit(deps, env, info, member_limit)
         }
         ExecuteMsg::UpdateAdmins { admins } => execute_update_admins(deps, env, info, admins),
         ExecuteMsg::Freeze {} => execute_freeze(deps, env, info),
@@ -281,6 +281,7 @@ pub fn execute_remove_members(
 /// Increase member limit. Must include a fee if crossing 1000, 2000, etc member limit.
 pub fn execute_increase_member_limit(
     deps: DepsMut,
+    env: Env,
     info: MessageInfo,
     member_limit: u32,
 ) -> Result<Response, ContractError> {
@@ -311,7 +312,7 @@ pub fn execute_increase_member_limit(
 
     let mut res = Response::new();
     if upgrade_fee > 0 {
-        checked_fair_burn(&info, upgrade_fee, None, &mut res)?
+        checked_fair_burn(&info, &env, upgrade_fee, None, &mut res)?
     }
 
     config.member_limit = member_limit;
diff --git a/contracts/whitelists/whitelist-merkletree/src/contract.rs b/contracts/whitelists/whitelist-merkletree/src/contract.rs
index bc3ca5d0..cbea683e 100644
--- a/contracts/whitelists/whitelist-merkletree/src/contract.rs
+++ b/contracts/whitelists/whitelist-merkletree/src/contract.rs
@@ -74,7 +74,7 @@ pub fn instantiate(
     }
 
     let mut res = Response::new();
-    checked_fair_burn(&info, CREATION_FEE, None, &mut res)?;
+    checked_fair_burn(&info, &env, CREATION_FEE, None, &mut res)?;
 
     let config = Config {
         start_time: msg.start_time,
diff --git a/contracts/whitelists/whitelist/src/contract.rs b/contracts/whitelists/whitelist/src/contract.rs
index c6d416e9..3bc27e0f 100644
--- a/contracts/whitelists/whitelist/src/contract.rs
+++ b/contracts/whitelists/whitelist/src/contract.rs
@@ -124,7 +124,7 @@ pub fn instantiate(
     }
 
     let mut res = Response::new();
-    checked_fair_burn(&info, creation_fee, None, &mut res)?;
+    checked_fair_burn(&info, &env, creation_fee, None, &mut res)?;
 
     if config.member_limit < config.num_members {
         return Err(ContractError::MembersExceeded {
@@ -161,7 +161,7 @@ pub fn execute(
             execute_update_per_address_limit(deps, info, per_address_limit)
         }
         ExecuteMsg::IncreaseMemberLimit(member_limit) => {
-            execute_increase_member_limit(deps, info, member_limit)
+            execute_increase_member_limit(deps, env, info, member_limit)
         }
         ExecuteMsg::UpdateAdmins { admins } => execute_update_admins(deps, env, info, admins),
         ExecuteMsg::Freeze {} => execute_freeze(deps, env, info),
@@ -320,6 +320,7 @@ pub fn execute_update_per_address_limit(
 /// Increase member limit. Must include a fee if crossing 1000, 2000, etc member limit.
 pub fn execute_increase_member_limit(
     deps: DepsMut,
+    env: Env,
     info: MessageInfo,
     member_limit: u32,
 ) -> Result<Response, ContractError> {
@@ -350,7 +351,7 @@ pub fn execute_increase_member_limit(
 
     let mut res = Response::new();
     if upgrade_fee > 0 {
-        checked_fair_burn(&info, upgrade_fee, None, &mut res)?
+        checked_fair_burn(&info, &env, upgrade_fee, None, &mut res)?
     }
 
     config.member_limit = member_limit;
diff --git a/packages/sg1/src/lib.rs b/packages/sg1/src/lib.rs
index 68fb949a..324ee66a 100644
--- a/packages/sg1/src/lib.rs
+++ b/packages/sg1/src/lib.rs
@@ -1,7 +1,7 @@
 use anybuf::Anybuf;
 use cosmwasm_std::{
-    coin, coins, ensure, Addr, BankMsg, Coin, CosmosMsg, Decimal, Event, MessageInfo, Response,
-    SubMsg, Uint128,
+    coin, coins, ensure, Addr, BankMsg, Coin, CosmosMsg, Decimal, Env, Event, MessageInfo,
+    Response, SubMsg, Uint128,
 };
 use cw_utils::{may_pay, must_pay, PaymentError};
 use sg_utils::NATIVE_DENOM;
@@ -9,13 +9,16 @@ use thiserror::Error;
 
 // governance parameters
 const FEE_BURN_PERCENT: u64 = 50;
-const FOUNDATION: &str = "init1d7q84m8y8gy0dcql090sqg9h7w9kydzntzx5yk";
-const LAUNCHPAD_DAO_ADDRESS: &str = "init1flaytkt2zyylnc2p9u77jjgwrct206x86m03ac";
-const LIQUIDITY_DAO_ADDRESS: &str = "init176qen2pg7lmfel2ph4rrsmm04qtl8qv67mj84d";
+const FOUNDATION: &str = "stars1xqz6xujjyz0r9uzn7srasle5uynmpa0zkjr5l8";
+const LAUNCHPAD_DAO_ADDRESS: &str =
+    "stars1huqk6ha02jgrm69lxh8xfgl6wch9wlg7s65ujxydwdr725cxvuus423tj0";
+const LIQUIDITY_DAO_ADDRESS: &str =
+    "stars12he2ldxl950wfypvelqwkac4mdul7clzgd8wdlnmjvll8z2cc47qsatvl2";
 
 /// Burn and distribute fees and return an error if the fee is not enough
 pub fn checked_fair_burn(
     info: &MessageInfo,
+    env: &Env,
     fee: u128,
     developer: Option<Addr>,
     res: &mut Response,
@@ -27,7 +30,7 @@ pub fn checked_fair_burn(
     };
 
     if payment.u128() != 0u128 {
-        fair_burn(info.sender.to_string(), fee, developer, res);
+        fair_burn(env.contract.address.to_string(), fee, developer, res);
     }
 
     Ok(())
diff --git a/scripts/optimize.sh b/scripts/optimize.sh
index 08f11b9c..dc2da9c6 100755
--- a/scripts/optimize.sh
+++ b/scripts/optimize.sh
@@ -1,4 +1,4 @@
 docker run --rm -v "$(pwd)":/code --platform linux/amd64 \
 	--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
 	--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
-	cosmwasm/workspace-optimizer:0.12.13
+	cosmwasm/optimizer:0.16.1


Test patch:
diff --git a/test-suite/src/common_setup/setup_minter/common/constants.rs b/test-suite/src/common_setup/setup_minter/common/constants.rs
index a2d9baa6..79ce5239 100644
--- a/test-suite/src/common_setup/setup_minter/common/constants.rs
+++ b/test-suite/src/common_setup/setup_minter/common/constants.rs
@@ -12,6 +12,8 @@ pub const SHUFFLE_FEE: u128 = 500_000_000;
 pub const MAX_PER_ADDRESS_LIMIT: u32 = 50;
 pub const DEV_ADDRESS: &str = "stars1abcd4kdla12mh86psg4y4h6hh05g2hmqoap350";
 pub const MIN_MINT_PRICE_OPEN_EDITION: u128 = 100_000_000;
-pub const FOUNDATION: &str = "init1d7q84m8y8gy0dcql090sqg9h7w9kydzntzx5yk";
-pub const LIQUIDITY_DAO_ADDRESS: &str = "init176qen2pg7lmfel2ph4rrsmm04qtl8qv67mj84d";
-pub const LAUNCHPAD_DAO_ADDRESS: &str = "init1flaytkt2zyylnc2p9u77jjgwrct206x86m03ac";
+pub const FOUNDATION: &str = "stars1xqz6xujjyz0r9uzn7srasle5uynmpa0zkjr5l8";
+pub const LIQUIDITY_DAO_ADDRESS: &str =
+    "stars12he2ldxl950wfypvelqwkac4mdul7clzgd8wdlnmjvll8z2cc47qsatvl2";
+pub const LAUNCHPAD_DAO_ADDRESS: &str =
+    "stars1huqk6ha02jgrm69lxh8xfgl6wch9wlg7s65ujxydwdr725cxvuus423tj0";