Cover photo

从合约解读公售(以superful为例)

https://twitter.com/221133kk1

最近有一款类似premint功能的网站上线,叫做superful,采取WL+freemint的形式发售

其功能对标premint,目前premint地板价0.7+,基于这个预期,superful白名单轮结束后,地板价表现得非常不错,一度接近0.3e

白名单轮结束后,还剩100多个在公售轮免费mint,时间是30日晚22点,大家以为又是一场gas war,但是结果出人意料,不少人在22点前就抢跑了;

superful的opensea截图
superful的opensea截图

今天这篇文章,主要从合约的角度,来看NFT公售具体是怎么回事,我们是否能做到抢跑;

首先,我们先找到superful的合约地址,如下:

https://etherscan.io/address/0xc97a4c9773ebfbba0f32ff147b9b29972aba0b38

我们需要了解这两个合约的对象
我们需要了解这两个合约的对象

我们点开这个NFT的合约,在写合约这边第四个,就是公售按钮,而且可以直接写,没有签名,也不需要填写价格和数量;

理论上,只要项目方设置开始mint,这边直接打出交易即可;

post image

确认了公售的函数名称后(publicmint),我们去合约代码中,看一下这个函数可以启用的条件;

启用条件
启用条件

我们可以看到,公售启动的要求是:

!isAllowlistSale, "Public Sale has not started"

意思就是:只要allowlistsale还开启,那么公售就不能开始,所以我们去找allowlistsale这个函数;

结果如下:

post image

目前的结果是false,也就是allowlistsale结束(白名单轮结束),公售按钮处于启动状态

在公售开始前,这个值是true,所以,我们其实只要知道,项目方什么时候把这个值设置成了false,我们就可以去打mint了,项目方说22:00,我们就真的去等整点,那很可能会打不到

这也是很多次,我们发现,每次公售都有人比预定的时间抢跑几秒甚至几十秒;

那么,我们看一下,项目方是什么时间把这个allowlistsale的值改掉的?

post image

我们在创建者的合约上一看,原来在21:59:12(合约上的时间是UTC时间,+8才是北京时间)的时候,项目方设置了公售开启;

当时很多人监听了项目方的pending,在这个交互pending的时候就发出了mint请求,结果全部失败了,为什么呢?

post image

原来,项目方开启公售需要2个开关,真正开启公售的时间是set paused的这个时间,也就是allowlistsale变成flase的38秒之后。

post image

所以,我们看一件有趣的事情:

post image

有个小哥手贱(钱包地址:0x051d39c0f2104561dfab8dbabc4b3aed5c8dc0b8),擅自设置allowlistsale的参数,当然因为他不是合约的创建者,这个设置没成功;

但是骗了很多监听合约的钱包,一窝蜂的发publicmint请求,这些钱包只要监听到设置allowlistsale的交易正在pending,就会同时发送publicmint请求,以争取在同一个区块内发送交易;

很显然,这些钱包都被耍了,粗略数了一下,大概有近1000个钱包被耍了,发送了Publicmint请求;

话说,科学家们也太内卷了,上千个钱包去抢100多个公售(/(ㄒoㄒ)/~~)

post image

然后,这些科学家又被耍了第二遍,这次是项目方设置了allowlistsale的参数变更,于是这些钱包又再次发送publicmint请求,看图,又是满满的几页,全部失败;

post image

直到15244202区块,项目方设置了开启,才能真正的去发送publicmint请求,看下具体时间:

post image

北京时间21:59:50,所以如果你盯着10点去发送交易的话,是不能进入0区块打包交易的,因为实际上提前10秒就可以开始打了;

0区块打包交易
0区块打包交易

我们可以看到,最下面的set paused 的区块是15244202,上面成功的publicmint都是在这个区块内完成的;

看下图,在下一个区块15244203,已经不能保证全部成功了,也就是说,你不能在0区块打出去交易,最多还能在下一个区块尝试一下,一个区块只有十几秒时间;

也就说,你在22:00:07秒之前,没有把交易打出去,就已经没有机会了。

post image

写到这里,从合约角度解读superful的公售就完成了,最后给大家发个小工具,用来监听链上动态:

https://explorer.blocknative.com/?v=1.34.2&0=ethereum&1=main

如图,当我们通过上文,判断出公售开启的条件后,我们就去监听NFT创建者的合约(不直接监听NFT合约是因为NFT的transactions太多,噪音太大)

我们把创建者合约输入到这里
我们把创建者合约输入到这里

当我们监听到这个NFT创建者合约,进行了某项设置,我们就可以同时发送mint请求了,这样就有机会卡到0区块或者1区块,把mint请求发出去了。

post image

-END-