最近这几天ERC721R着实的刷了一波波屏。 不止一个群里友群沸腾起来了,以后可以顺利的冲土狗了,甚至想找第一个用721R合约的冲冲,其实事实证明的这样吗?
Web3的世界,代码就是法律,一切都得从代码出发。首先我们打开官网可以看到有这样的话。

就是漏洞的方法伏笔,在代码中也可以找到这个的
function refund(uint256[] calldata tokenIds) external {
require(refundGuaranteeActive(), "Refund expired");
for (uint256 i = 0; i < tokenIds.length; i++) {
uint256 tokenId = tokenIds[i];
require(msg.sender == ownerOf(tokenId), "Not token owner");
transferFrom(msg.sender, refundAddress, tokenId);
}
uint256 refundAmount = tokenIds.length * mintPrice;
Address.sendValue(payable(msg.sender), refundAmount);
}
我们可以看到退还的NFT是退往refundAddress地址的,而这是一个变量,合约持有人可以通过下面的方法来设置退还的地址。
function setRefundAddress(address _refundAddress) external onlyOwner {
refundAddress = _refundAddress;
}
下面来实操一下,复制官方给样例(改一下价格),在网上测试部署一下

部署成功之后,打开公共铸币开关,铸造3个NFT

也能看到已经签约了,已经卖掉了三个nft的

我就是准备地毯拉的项目方交付,我准备把RefundAddress设置成自己的地址

然后有普通玩家,觉得现在不行了,或者破发了,想要一个,调用rufud


看到这不是心想,这不是都成功设置了吗?

现在我只需要换这个钱包,一直退还这个钱包,契约里的钞票被我掏空

在钱包里进行两次追踪之后,就可以看到合约了。合约里有一个业主薄荷的方法,项目方是免费的。只要项目方有一个令牌,就可以拉扯空合约的所有币种。
你急着以为结束了吗?
是要拉格拉的方子,这样操作,大花啊啊我加气,我不执行,于是我在约定中的一个方法,而且薄荷价格的做法我很用心

设置Mint价格看起来不是很合理,不仔细阅读代码不会注意这个方法。
我们照着上面的再模特,并且薄荷三个。
((()((())看就无效了,退还的eth为0,nft还会被转移。

可以看到nft是有转移,但并没有退还

对比正常的方法

而我现在结束的时间只需要等待设置的滋味了。
故:不要轻易使用 721R 契约修改的土狗,要冲的话需要检查是否薄荷的价格,并且是否可以转移的 nft 需要是黑洞

