Cover photo

ERC721R,RugPull的N种方式?

最近这几天ERC721R着实的刷了一波波屏。 不止一个群里友群沸腾起来了,以后可以顺利的冲土狗了,甚至想找第一个用721R合约的冲冲,其实事实证明的这样吗?

Web3的世界,代码就是法律,一切都得从代码出发。首先我们打开官网可以看到有这样的话。

post image

就是漏洞的方法伏笔,在代码中也可以找到这个的

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;
    }

下面来实操一下,复制官方给样例(改一下价格),在网上测试部署一下

post image

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

post image

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

post image

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

post image

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

post image
退款后钱包余额,退款前忘记截图了,是1.26
退款后钱包余额,退款前忘记截图了,是1.26

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

post image

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

post image

在钱包里进行两次追踪之后,就可以看到合约了。合约里有一个业主薄荷的方法,项目方是免费的。只要项目方有一个令牌,就可以拉扯空合约的所有币种。

你急着以为结束了吗?

是要拉格拉的方子,这样操作,大花啊啊我加气,我不执行,于是我在约定中的一个方法,而且薄荷价格的做法我很用心

post image

设置Mint价格看起来不是很合理,不仔细阅读代码不会注意这个方法。

我们照着上面的再模特,并且薄荷三个。

((()((())看就无效了,退还的eth为0,nft还会被转移。

post image

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

post image

对比正常的方法

post image

而我现在结束的时间只需要等待设置的滋味了。

故:不要轻易使用 721R 契约修改的土狗,要冲的话需要检查是否薄荷的价格,并且是否可以转移的 nft 需要是黑洞