@@ -6,8 +6,9 @@ use crate::msg::{
6
6
} ;
7
7
use crate :: state:: {
8
8
increment_token_index, Config , ConfigExtension , CONFIG , MINTABLE_NUM_TOKENS , MINTER_ADDRS ,
9
- SG721_ADDRESS , STATUS , TOTAL_MINT_COUNT , WHITELIST_FS_MINTER_ADDRS , WHITELIST_MINTER_ADDRS ,
10
- WHITELIST_SS_MINTER_ADDRS , WHITELIST_TS_MINTER_ADDRS ,
9
+ SG721_ADDRESS , STATUS , TOTAL_MINT_COUNT , WHITELIST_FS_MINTER_ADDRS , WHITELIST_FS_MINT_COUNT ,
10
+ WHITELIST_MINTER_ADDRS , WHITELIST_SS_MINTER_ADDRS , WHITELIST_SS_MINT_COUNT ,
11
+ WHITELIST_TS_MINTER_ADDRS , WHITELIST_TS_MINT_COUNT ,
11
12
} ;
12
13
#[ cfg( not( feature = "library" ) ) ]
13
14
use cosmwasm_std:: entry_point;
@@ -26,7 +27,7 @@ use sg2::query::Sg2QueryMsg;
26
27
use sg4:: { MinterConfig , Status , StatusResponse , SudoMsg } ;
27
28
use sg721:: { ExecuteMsg as Sg721ExecuteMsg , InstantiateMsg as Sg721InstantiateMsg } ;
28
29
use sg_std:: StargazeMsgWrapper ;
29
- use sg_tiered_whitelist_flex:: msg:: QueryMsg as TieredWhitelistQueryMsg ;
30
+ use sg_tiered_whitelist_flex:: msg:: { QueryMsg as TieredWhitelistQueryMsg , StageResponse } ;
30
31
use sg_whitelist_flex:: msg:: {
31
32
ConfigResponse as WhitelistConfigResponse , HasMemberResponse , Member ,
32
33
QueryMsg as WhitelistQueryMsg ,
@@ -416,24 +417,45 @@ fn is_public_mint(deps: Deps, info: &MessageInfo) -> Result<bool, ContractError>
416
417
}
417
418
418
419
// Check wl per address limit
419
- let wl_mint_count = whitelist_mint_count ( deps, info, whitelist. clone ( ) ) ?. 0 ;
420
+ let wl_mint_count = whitelist_mint_count ( deps, info, whitelist. clone ( ) ) ?;
420
421
if config. extension . num_tokens . is_none ( ) {
421
422
ensure ! (
422
- wl_mint_count < config. extension. per_address_limit,
423
+ wl_mint_count. 0 < config. extension. per_address_limit,
423
424
ContractError :: MaxPerAddressLimitExceeded { }
424
425
) ;
425
426
}
426
427
427
428
let wl_limit: Member = deps. querier . query_wasm_smart (
428
- whitelist,
429
+ whitelist. clone ( ) ,
429
430
& WhitelistQueryMsg :: Member {
430
431
member : info. sender . to_string ( ) ,
431
432
} ,
432
433
) ?;
433
- if wl_mint_count >= wl_limit. mint_count {
434
+ if wl_mint_count. 0 >= wl_limit. mint_count {
434
435
return Err ( ContractError :: MaxPerAddressLimitExceeded { } ) ;
435
436
}
436
437
438
+ // Check if whitelist stage mint count limit is reached
439
+ if wl_mint_count. 1 && wl_mint_count. 2 . is_some ( ) {
440
+ let active_stage: StageResponse = deps. querier . query_wasm_smart (
441
+ whitelist. clone ( ) ,
442
+ & TieredWhitelistQueryMsg :: Stage {
443
+ stage_id : wl_mint_count. 2 . unwrap ( ) - 1 ,
444
+ } ,
445
+ ) ?;
446
+ if active_stage. stage . mint_count_limit . is_some ( ) {
447
+ let stage_mint_count = match wl_mint_count. 2 . unwrap ( ) {
448
+ 1 => WHITELIST_FS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ,
449
+ 2 => WHITELIST_SS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ,
450
+ 3 => WHITELIST_TS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ,
451
+ _ => return Err ( ContractError :: InvalidStageID { } ) ,
452
+ } ;
453
+ if stage_mint_count >= active_stage. stage . mint_count_limit . unwrap ( ) {
454
+ return Err ( ContractError :: WhitelistMintCountLimitReached { } ) ;
455
+ }
456
+ }
457
+ }
458
+
437
459
Ok ( false )
438
460
}
439
461
@@ -504,9 +526,27 @@ fn save_whitelist_mint_count(
504
526
) -> StdResult < ( ) > {
505
527
if is_tiered_whitelist & stage_id. is_some ( ) {
506
528
match stage_id {
507
- Some ( 1 ) => WHITELIST_FS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ,
508
- Some ( 2 ) => WHITELIST_SS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ,
509
- Some ( 3 ) => WHITELIST_TS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ,
529
+ Some ( 1 ) => {
530
+ let _ = WHITELIST_FS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ;
531
+ let mut wl_fs_mint_count =
532
+ WHITELIST_FS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ;
533
+ wl_fs_mint_count += 1 ;
534
+ WHITELIST_FS_MINT_COUNT . save ( deps. storage , & wl_fs_mint_count)
535
+ }
536
+ Some ( 2 ) => {
537
+ let _ = WHITELIST_SS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ;
538
+ let mut wl_ss_mint_count =
539
+ WHITELIST_SS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ;
540
+ wl_ss_mint_count += 1 ;
541
+ WHITELIST_SS_MINT_COUNT . save ( deps. storage , & wl_ss_mint_count)
542
+ }
543
+ Some ( 3 ) => {
544
+ let _ = WHITELIST_TS_MINTER_ADDRS . save ( deps. storage , & info. sender , & count) ;
545
+ let mut wl_ts_mint_count =
546
+ WHITELIST_TS_MINT_COUNT . may_load ( deps. storage ) ?. unwrap_or ( 0 ) ;
547
+ wl_ts_mint_count += 1 ;
548
+ WHITELIST_TS_MINT_COUNT . save ( deps. storage , & wl_ts_mint_count)
549
+ }
510
550
_ => Err ( StdError :: generic_err ( "Invalid stage ID" ) ) ,
511
551
}
512
552
} else {
0 commit comments