# 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 ![](https://i.imgur.com/mXDZmo5.png) 因時間關係所以Merkle Tree的address list只用8組address ![](https://i.imgur.com/wKJPZ27.png) 測試結果如下圖,因266/8約等於33所以將isWhitelistedMerkle的2223乘33等於73359也低於148465 ![](https://i.imgur.com/Xb0jtvM.png)