# ERC721R,RugPull的N种方式? **Published by:** [0xMask](https://paragraph.com/@codermy/) **Published on:** 2022-04-12 **URL:** https://paragraph.com/@codermy/erc721r-rugpull-n ## Content 最近这几天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退款后钱包余额,退款前忘记截图了,是1.26看到这不是心想,这不是都成功设置了吗?现在我只需要换这个钱包,一直退还这个钱包,契约里的钞票被我掏空在钱包里进行两次追踪之后,就可以看到合约了。合约里有一个业主薄荷的方法,项目方是免费的。只要项目方有一个令牌,就可以拉扯空合约的所有币种。 你急着以为结束了吗? 是要拉格拉的方子,这样操作,大花啊啊我加气,我不执行,于是我在约定中的一个方法,而且薄荷价格的做法我很用心设置Mint价格看起来不是很合理,不仔细阅读代码不会注意这个方法。 我们照着上面的再模特,并且薄荷三个。 ((()((())看就无效了,退还的eth为0,nft还会被转移。可以看到nft是有转移,但并没有退还对比正常的方法而我现在结束的时间只需要等待设置的滋味了。 故:不要轻易使用 721R 契约修改的土狗,要冲的话需要检查是否薄荷的价格,并且是否可以转移的 nft 需要是黑洞 ## Publication Information - [0xMask](https://paragraph.com/@codermy/): Publication homepage - [All Posts](https://paragraph.com/@codermy/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@codermy): Subscribe to updates