# 黑魔法作业2期：PXN合约分析

By [0xXiaoChen](https://paragraph.com/@0xxiaochen) · 2022-05-10

---

欢迎关注我的推特：[@0xXiaoChen](https://twitter.com/0xXiaoChen)

欢迎加入黑魔法社区：[NFT黑魔法社区](https://discord.com/invite/YgM5emfb53)

PXN合约
-----

`PXN`的合约已经[开源](https://etherscan.io/address/0x160c404b2b49cbc3240055ceaee026df1e8497a0#code)和上架[OpenSea](https://opensea.io/collection/pxnghostdivision)，合约类型是ERC721A。

![](https://storage.googleapis.com/papyrus_images/3de67e3a969b20215ea410ab4856fcc033f749707d08d43576fd1c4e607e203b.jpg)

### 发售方式

*   荷兰拍 4000 首拍2E，每15分钟降低0.05E 开始时间固定
    
*   MintWL 6000 初始价格设置为0.35E，最后价格为荷兰拍最终价格的一半
    
*   团队预留
    
*   开发者预留
    

### Mint函数

看两个主要MINT函数：

`mintDutchAuction()`

*   使用`callerIsUser`修饰器，限制调用者为真实地址（非合约）
    

        modifier callerIsUser() {
            require(tx.origin == msg.sender, "The caller is another contract");
            _;
        }
    

*   需要进行signature签名
    
*   条件:
    
    DA\_ACTIVE == true
    
    directMintAllowed为flase时对签名进行recover()校验，保证是前端mint
    
    当前总量+Mint数量 < 荷兰拍规定的数量
    
    当前时间戳 > 荷兰拍规定开始的时间戳 且 < MintWL规定开始的时间戳
    
    此次Mint数量最大为2，地址最大Mint数为2
    
    Mint价格由currentPrice()调用获取，并检查发送的ETH是否足够Mint
    
    userToTokenBatchPriceData结构体会记录本次Mint的基本信息
    
*   条件成立，使用\_safeMint()进行Mint
    

`mintWl()`

*   使用`callerIsUser`修饰器，限制调用者为真实地址（非合约）
    

        modifier callerIsUser() {
            require(tx.origin == msg.sender, "The caller is another contract");
            _;
        }
    

*   需要进行signature签名
    
*   条件:
    
    DA\_ACTIVE == true
    
    directMintAllowed为flase时对签名进行recover()校验，保证是前端mint
    
    当前总量+Mint数量 < WLmint规定的数量
    
    userToHasMintedPublicWL查询调用者是否重复mint
    
    当前时间戳 > MintWL规定开始的时间戳，时间持续24小时
    
    此次Mint数量为1
    
    检查发送的ETH是否足够Mint
    
    将userToHasMintedPublicWL更改为true
    
*   条件成立，使用\_safeMint()进行Mint
    

总结：合约将\_safeMint()函数放在最后，以及对signature签名进行校验，同时又规避了外部合约Mint。目前我看了是一个没有什么问题的合约，在devMint和teamMint也做了总量设置，不会出现项目方作恶的情况。

如果有什么问题，请欢迎私信[推特](https://twitter.com/0xXiaoChen)指正！！

---

*Originally published on [0xXiaoChen](https://paragraph.com/@0xxiaochen/2-pxn)*
