open_edition_factory/
msg.rs

1use 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    // If not the admin/init
24    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        // Validation of the Minter Params -> need to be in-line with the factory
36        init_msg.nft_data = NftData::validate(init_msg.nft_data)?;
37
38        // Optional: can have a max mint amount
39        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        // Optional: not time limited
67        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        // Need to validate the end time and number of tokens are not both None
74        // At least 1 constraint is required
75        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/// Message for params so they can be updated individually by governance
106#[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}