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

欢迎关注我的推特:@0xXiaoChen

欢迎加入黑魔法社区:NFT黑魔法社区

PXN合约

PXN的合约已经开源和上架OpenSea,合约类型是ERC721A。

post image

发售方式

  • 荷兰拍 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也做了总量设置,不会出现项目方作恶的情况。

如果有什么问题,请欢迎私信推特指正!!