# Garrick信仲 | C0051202 第六週作業 ## 題目 你會如何優化台灣項目嘟嘟房合約呢? 閱讀嘟嘟房合約 使用 foundry 二次開發 白名單錯誤 ## 作業說明 1. 在CarMan合約先增加二個變數 ``` address public owner; bytes32 public root; ``` 2. import以下三個sol ``` import "../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "../lib/openzeppelin-contracts/contracts/access/Ownable.sol"; import "../lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol"; ``` 3. 增加setRoot方法和verifyProof修飾,要確保setRoot只有owner能設定,因為名單會異動所以需要owner在需要的時候更新 ``` function setRoot(bytes32 _root) public onlyOwner { root = _root; } modifier verifyProof(address user, bytes32[] memory proof) { require(MerkleProof.verify(proof, root, keccak256(abi.encodePacked(user))), "Invalid proof"); _; } ``` 4. 把isWhitlisted方法改成以下寫法 ``` function isWhitelistedMerkle(address _user, bytes32[] calldata _proof) public verifyProof(_user, _proof) view onlyOwner returns (bool){ return true; } ``` ## Foundry測試 合約上直接製作266個地址並寫把CarMan的isWhitelisted方法獨立出來測試Gas Fee, 並寫一個isWhitelistedMerkle方法測試使用Merkle Tree的方式測試Gas Fee  因時間關係所以Merkle Tree的address list只用8組address  測試結果如下圖,因266/8約等於33所以將isWhitelistedMerkle的2223乘33等於73359也低於148465 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up