
Uniswap V3交易预计算技巧
Uniswap上做swap交易时,比如用usdt购买btc,会根据界面上输入的usdt数量,实时计算出可以swap到多少个btc,v2版本因为是应用了xy=k的公式,可以方便的计算出来。代码里通过getAmountOut和getAmountIn得到,这两个都是view函数,不需要消耗gas。而到了...
Meebits mint随机算法
先上代码function randomIndex() internal returns (uint) { uint totalSize = TOKEN_LIMIT - numTokens; uint index = uint(keccak256(abi.encodePacked(nonce, ms...

nftx闪电贷领取apecoin空投
已经是两个多月前的事件了,这几天才对这个tx进行了分析和fork重现,记录下来加深一下理解。apecoin的空投并没有限制调用方不能是合约地址,也不是用链下签名再到合约里验签的方式来领取空投,而是直接在合约里校验调用方的地址里有没有bayc/mayc,再加上apecoin当时的价格在8u左右,总体...
<100 subscribers
最近比较关注NFT市场,发现有一个项目3Larders在随机开图上做得比较好,采用chainlink随机数当种子,再对tokenId与元数据的映射进行洗牌,确保图片的随机分配,在此点赞!因为查看了很多NFT项目,在随机开图方面都没有做到公开透明,3Landers很是难得。我特别花了些时间对它的合约、mint与开图进行了分析。
合约地址是0xb4d06d46A8285F4EC79Fd294F78a881799d8cEd9,项目方用0x8cBc5c6f260bEf0f9edB71219A61A1c52062A586这个地址来创建合约

setAirdropRole 设置自己的地址为可以发放空投的地址。项目方保留了200个在金库里做为后续活动使用,他在这里采用airdrop的方式mint到指定的地址,后面会提到
setTransactionLimit 设置单笔交易白单可mint数量,单笔交易公售可mint数量,一个白单可mint数量
setWhitelistSigningAddress 设置验证白单签名的地址
setPrivateSaleCap 设置白单mint总量
setDefaultURI 设置默认元数据URI,这个相当于盲盒的元数据,设置的是一个http地址
https://ipfs.io/ipfs/QmNWziXfkdZRTY6ZQHkHGUe8smUCNGPT4umrpQ8KVjqNDB但实际是存在IPFS上的
setDiscountBlockSize 设置公售荷兰拍多少个区块进行价格递减,这里设置的是90个块
setPriceDecayParams 设置荷拍的最低价和递减金额,这里设置的是递减0.1 eth,最低到0.15 eth
enablePrivateSale 设置状态为白单mint状态
0x92fb4967 setPrivateSaleConfig 设置白单mint的开始和结束区块
推荐一个工具https://github.com/cleanunicorn/abi2signature,可以方便的根据abi计算出函数signature,对于解读tx有帮助

airdrop 空投前面200个NFT给金库地址
setReserve 设置金库保留的数量为200
中间有三笔airdrop是失败的,因为合约部署时默认金库保留数量是169,因此那三笔airdrop超过了169,所以失败了,他在重新setReserve改为200后,又再次airdrop成功
0x92fb4967 setPrivateSaleConfig 又再次设置白单mint的开始和结束区块,这笔应该是误操作,重复设置了
updateRoyaltyInfoForCollectionIfOwner 设置LooksRare交易的项目方版权费抽成比例和收款地址,这里设置了6.5%
transferOwnership 转移合约owner给另一个地址0xBDD7EFd925980cD07A6654227647cE244ACA8021
接着看0xBDD7EFd925980cD07A6654227647cE244ACA8021地址的操作

0xb87ced4e setPublicSaleConfig 设置公售的开始和结束区块
enablePublicSale 设置状态为公售状态
公售5分24秒就抢完了剩下的3337个,其中337个是白单mint剩余的,gas拉到了1750gwei,还是比较火爆的
release 分配收到的eth给5个地址,这里用了OpenZeppelin的PaymentSplitter做份额记录和分配
0xacf14efb 设置Rarible的版权费
requestChainlinkVRF 请求chainlink随机数种子
随后chainlink回调交易0xb5151c81935994690872bd1266205f8bfcdc217dca92706293b41f6fd19d1d71,对seed进行了设置
setBaseURI 设置开盒后的元数据URI为
https://0xstudio.mypinata.cloud/ipfs/QmRSK4yjjYXFWKtwZ6W4y3zXPPbQhvE3nAgG87aSjjTP1f/,实际是一个ipfs的目录
setRevealBlock 设置开盒区块
到这里NFT就开盒结束了。NFT的元数据是通过tokenURI进行获取的,现在来看下随机开盒如何实现
function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(tokenId < totalSupply()+1, "Token not exist."); return isRevealed() ? string( abi.encodePacked( _tokenBaseURI, getMetadata(tokenId), ".json" ) ) : _defaultURI; } function getMetadata(uint256 tokenId) public view returns (string memory) { if (_msgSender() != owner()) { require(tokenId < totalSupply(), "Token not exists."); } if (!isRevealed()) return "default"; uint256[] memory metadata = new uint256[](maxSupply+1); for (uint256 i = 1; i <= maxSupply; i += 1) { metadata[i] = i; } for (uint256 i = 2; i <= maxSupply; i += 1) { uint256 j = (uint256(keccak256(abi.encode(seed, i))) % (maxSupply)) + 1; if(j>=2 && j<= maxSupply) { (metadata[i], metadata[j]) = (metadata[j], metadata[i]); } } return Strings.toString(metadata[tokenId]); }
从tokenURI函数可以看到,未开盒时用_defaultURI显示元数据,开盒后用_tokenBaseURI加用getMetadata的结果显示元数据,以此来实现盲盒与开盒。getMetadata用seed随机数进行顺序清洗,对参数进行了keccak256哈希再用总数来取模,然后顺序对调,进行洗牌,保证了每次getMetadata的洗牌后顺序都一样。这套算法基于变量seed,而变量seed又基于chainlink,因此规避了开盒的人为操纵,增加了项目的透明度和公平性,值得学习。
最近比较关注NFT市场,发现有一个项目3Larders在随机开图上做得比较好,采用chainlink随机数当种子,再对tokenId与元数据的映射进行洗牌,确保图片的随机分配,在此点赞!因为查看了很多NFT项目,在随机开图方面都没有做到公开透明,3Landers很是难得。我特别花了些时间对它的合约、mint与开图进行了分析。
合约地址是0xb4d06d46A8285F4EC79Fd294F78a881799d8cEd9,项目方用0x8cBc5c6f260bEf0f9edB71219A61A1c52062A586这个地址来创建合约

setAirdropRole 设置自己的地址为可以发放空投的地址。项目方保留了200个在金库里做为后续活动使用,他在这里采用airdrop的方式mint到指定的地址,后面会提到
setTransactionLimit 设置单笔交易白单可mint数量,单笔交易公售可mint数量,一个白单可mint数量
setWhitelistSigningAddress 设置验证白单签名的地址
setPrivateSaleCap 设置白单mint总量
setDefaultURI 设置默认元数据URI,这个相当于盲盒的元数据,设置的是一个http地址
https://ipfs.io/ipfs/QmNWziXfkdZRTY6ZQHkHGUe8smUCNGPT4umrpQ8KVjqNDB但实际是存在IPFS上的
setDiscountBlockSize 设置公售荷兰拍多少个区块进行价格递减,这里设置的是90个块
setPriceDecayParams 设置荷拍的最低价和递减金额,这里设置的是递减0.1 eth,最低到0.15 eth
enablePrivateSale 设置状态为白单mint状态
0x92fb4967 setPrivateSaleConfig 设置白单mint的开始和结束区块
推荐一个工具https://github.com/cleanunicorn/abi2signature,可以方便的根据abi计算出函数signature,对于解读tx有帮助

airdrop 空投前面200个NFT给金库地址
setReserve 设置金库保留的数量为200
中间有三笔airdrop是失败的,因为合约部署时默认金库保留数量是169,因此那三笔airdrop超过了169,所以失败了,他在重新setReserve改为200后,又再次airdrop成功
0x92fb4967 setPrivateSaleConfig 又再次设置白单mint的开始和结束区块,这笔应该是误操作,重复设置了
updateRoyaltyInfoForCollectionIfOwner 设置LooksRare交易的项目方版权费抽成比例和收款地址,这里设置了6.5%
transferOwnership 转移合约owner给另一个地址0xBDD7EFd925980cD07A6654227647cE244ACA8021
接着看0xBDD7EFd925980cD07A6654227647cE244ACA8021地址的操作

0xb87ced4e setPublicSaleConfig 设置公售的开始和结束区块
enablePublicSale 设置状态为公售状态
公售5分24秒就抢完了剩下的3337个,其中337个是白单mint剩余的,gas拉到了1750gwei,还是比较火爆的
release 分配收到的eth给5个地址,这里用了OpenZeppelin的PaymentSplitter做份额记录和分配
0xacf14efb 设置Rarible的版权费
requestChainlinkVRF 请求chainlink随机数种子
随后chainlink回调交易0xb5151c81935994690872bd1266205f8bfcdc217dca92706293b41f6fd19d1d71,对seed进行了设置
setBaseURI 设置开盒后的元数据URI为
https://0xstudio.mypinata.cloud/ipfs/QmRSK4yjjYXFWKtwZ6W4y3zXPPbQhvE3nAgG87aSjjTP1f/,实际是一个ipfs的目录
setRevealBlock 设置开盒区块
到这里NFT就开盒结束了。NFT的元数据是通过tokenURI进行获取的,现在来看下随机开盒如何实现
function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(tokenId < totalSupply()+1, "Token not exist."); return isRevealed() ? string( abi.encodePacked( _tokenBaseURI, getMetadata(tokenId), ".json" ) ) : _defaultURI; } function getMetadata(uint256 tokenId) public view returns (string memory) { if (_msgSender() != owner()) { require(tokenId < totalSupply(), "Token not exists."); } if (!isRevealed()) return "default"; uint256[] memory metadata = new uint256[](maxSupply+1); for (uint256 i = 1; i <= maxSupply; i += 1) { metadata[i] = i; } for (uint256 i = 2; i <= maxSupply; i += 1) { uint256 j = (uint256(keccak256(abi.encode(seed, i))) % (maxSupply)) + 1; if(j>=2 && j<= maxSupply) { (metadata[i], metadata[j]) = (metadata[j], metadata[i]); } } return Strings.toString(metadata[tokenId]); }
从tokenURI函数可以看到,未开盒时用_defaultURI显示元数据,开盒后用_tokenBaseURI加用getMetadata的结果显示元数据,以此来实现盲盒与开盒。getMetadata用seed随机数进行顺序清洗,对参数进行了keccak256哈希再用总数来取模,然后顺序对调,进行洗牌,保证了每次getMetadata的洗牌后顺序都一样。这套算法基于变量seed,而变量seed又基于chainlink,因此规避了开盒的人为操纵,增加了项目的透明度和公平性,值得学习。

Uniswap V3交易预计算技巧
Uniswap上做swap交易时,比如用usdt购买btc,会根据界面上输入的usdt数量,实时计算出可以swap到多少个btc,v2版本因为是应用了xy=k的公式,可以方便的计算出来。代码里通过getAmountOut和getAmountIn得到,这两个都是view函数,不需要消耗gas。而到了...
Meebits mint随机算法
先上代码function randomIndex() internal returns (uint) { uint totalSize = TOKEN_LIMIT - numTokens; uint index = uint(keccak256(abi.encodePacked(nonce, ms...

nftx闪电贷领取apecoin空投
已经是两个多月前的事件了,这几天才对这个tx进行了分析和fork重现,记录下来加深一下理解。apecoin的空投并没有限制调用方不能是合约地址,也不是用链下签名再到合约里验签的方式来领取空投,而是直接在合约里校验调用方的地址里有没有bayc/mayc,再加上apecoin当时的价格在8u左右,总体...
Share Dialog
Share Dialog
No comments yet