open_edition_factory/
msg.rs1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{Coin, Deps, Env, Timestamp};
3
4use sg2::msg::{CreateMinterMsg, Sg2ExecuteMsg, UpdateMinterParamsMsg};
5
6use crate::state::OpenEditionMinterParams;
7use crate::types::NftData;
8use crate::ContractError;
9
10#[cw_serde]
11pub struct InstantiateMsg {
12 pub params: OpenEditionMinterParams,
13}
14
15#[cw_serde]
16pub struct OpenEditionMinterInitMsgExtension {
17 pub nft_data: NftData,
18 pub start_time: Timestamp,
19 pub end_time: Option<Timestamp>,
20 pub mint_price: Coin,
21 pub per_address_limit: u32,
22 pub num_tokens: Option<u32>,
23 pub payment_address: Option<String>,
25 pub whitelist: Option<String>,
26}
27
28impl OpenEditionMinterInitMsgExtension {
29 pub fn validate(
30 mut init_msg: OpenEditionMinterInitMsgExtension,
31 env: Env,
32 _deps: Deps,
33 params: &OpenEditionMinterParams,
34 ) -> Result<Self, ContractError> {
35 init_msg.nft_data = NftData::validate(init_msg.nft_data)?;
37
38 if let Some(max_num_tokens) = init_msg.num_tokens {
40 if max_num_tokens == 0 || max_num_tokens > params.extension.max_token_limit {
41 return Err(ContractError::InvalidNumTokens {
42 min: 1,
43 max: params.extension.max_token_limit,
44 });
45 }
46 }
47
48 let max = params.extension.max_per_address_limit;
49 let min = 1;
50 let per_address_limit = init_msg.per_address_limit;
51 if init_msg.per_address_limit < min || init_msg.per_address_limit > max {
52 return Err(ContractError::InvalidPerAddressLimit {
53 max,
54 min,
55 got: per_address_limit,
56 });
57 }
58
59 if init_msg.start_time <= env.block.time {
60 return Err(ContractError::InvalidStartTime(
61 init_msg.start_time,
62 env.block.time,
63 ));
64 }
65
66 if let Some(end_time) = init_msg.end_time {
68 if end_time <= init_msg.start_time {
69 return Err(ContractError::InvalidEndTime(init_msg.start_time, end_time));
70 }
71 }
72
73 if init_msg.end_time.is_none() && init_msg.num_tokens.is_none() {
76 return Err(ContractError::LimitOfTimeOrNumTokensRequired {});
77 }
78
79 if init_msg.mint_price.amount < params.min_mint_price.amount {
80 return Err(ContractError::InvalidMintPrice {});
81 }
82
83 Ok(OpenEditionMinterInitMsgExtension {
84 nft_data: init_msg.nft_data,
85 start_time: init_msg.start_time,
86 end_time: init_msg.end_time,
87 mint_price: init_msg.mint_price,
88 per_address_limit,
89 num_tokens: init_msg.num_tokens,
90 payment_address: init_msg.payment_address,
91 whitelist: init_msg.whitelist,
92 })
93 }
94}
95
96pub type OpenEditionMinterCreateMsg = CreateMinterMsg<OpenEditionMinterInitMsgExtension>;
97
98pub type ExecuteMsg = Sg2ExecuteMsg<OpenEditionMinterInitMsgExtension>;
99
100#[cw_serde]
101pub enum SudoMsg {
102 UpdateParams(Box<OpenEditionUpdateParamsMsg>),
103}
104
105#[cw_serde]
107pub struct OpenEditionUpdateParamsExtension {
108 pub max_token_limit: Option<u32>,
109 pub max_per_address_limit: Option<u32>,
110 pub min_mint_price: Option<Coin>,
111 pub airdrop_mint_fee_bps: Option<u64>,
112 pub airdrop_mint_price: Option<Coin>,
113 pub dev_fee_address: Option<String>,
114}
115pub type OpenEditionUpdateParamsMsg = UpdateMinterParamsMsg<OpenEditionUpdateParamsExtension>;
116
117#[cw_serde]
118pub struct ParamsResponse {
119 pub params: OpenEditionMinterParams,
120}