{"id":13789743,"url":"https://github.com/WTFAcademy/WTF-gas-optimization","last_synced_at":"2025-05-12T07:30:57.878Z","repository":{"id":142903920,"uuid":"614227550","full_name":"WTFAcademy/WTF-gas-optimization","owner":"WTFAcademy","description":"WTF Solidity gas optimization techniques, verified with Foundry.","archived":false,"fork":false,"pushed_at":"2025-01-03T08:09:10.000Z","size":139,"stargazers_count":215,"open_issues_count":0,"forks_count":38,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-12T18:48:02.286Z","etag":null,"topics":["blockchain","dapp","ethereum","smart-contracts","solidity","web3"],"latest_commit_sha":null,"homepage":"","language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WTFAcademy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-15T06:45:59.000Z","updated_at":"2025-04-04T18:31:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"0a65fb52-cbeb-4c7f-8d62-ad50978edf6f","html_url":"https://github.com/WTFAcademy/WTF-gas-optimization","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WTFAcademy%2FWTF-gas-optimization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WTFAcademy%2FWTF-gas-optimization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WTFAcademy%2FWTF-gas-optimization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WTFAcademy%2FWTF-gas-optimization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WTFAcademy","download_url":"https://codeload.github.com/WTFAcademy/WTF-gas-optimization/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253695038,"owners_count":21948803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","dapp","ethereum","smart-contracts","solidity","web3"],"created_at":"2024-08-03T22:00:32.464Z","updated_at":"2025-05-12T07:30:57.594Z","avatar_url":"https://github.com/WTFAcademy.png","language":"Solidity","funding_links":[],"categories":["Roadmap"],"sub_categories":[],"readme":"# WTF Gas Optimization\n\nSolidity gas optimization techniques, verified with Foundry. \n\n总结 Solidity 智能合约省 gas 技巧，并使用 Foundry 验证。\n\nLead by [@0xKaso](https://github.com/0xKaso)\n\n## Outline\n\n[1. use constant and immutable](#1-use-constant-and-immutable)\n\n[2. use calldata over memory](#2-use-calldata-over-memory)\n\n[3. use Bitmap](#3-use-bitmap)\n\n[4. use unchecked](#4-use-unchecked)\n\n[5. use uint256 over uint8](#5-use-uint256-over-uint8)\n\n[6. use custom error over require/assert](#6-use-custom-error-over-requireassert)\n\n[7. use local variable over storage](#7-use-local-variable-over-storage)\n\n[8. use clone over new/create2 to deploy contracts](#8-use-clone-over-newcreate2-to-deploy-contract)\n\n[9. packing storage slots](#9-packing-storage-slots)\n\n[10. use ++i as better increment](#10-use-i-as-better-increment)\n\n[11. use uint in reentrancy guard](#11-use-uint-in-reentrancy-guard)\n\n[12. use \u003c over \u003c=](#12-use--over)\n\n[13. optimized selector/method id](#13-optimized-selector)\n\n[14. selector/method-id order matters](#14-selector-order)\n\n[15. use shorter string in require()](#15-shorter-string-in-require)\n\n[16. use short circuit in logic operation `||` or `\u0026\u0026`](#16-short-circuit-in-logic-operation)\n\n[17. delete variables to get gas refund](#17-delete-variables-to-get-gas-refund)\n\n[18. do not initialize state variables with default values](#18-do-not-initialize-state-variables-with-default-values)\n\n[19. swap 2 variables in 1 line with destructuring assignment](#19-swap-2-variables-in-1-line-with-destructuring-assignment)\n\n[20. set constructor to payable to save gas](#20-set-constructor-to-payable-to-save-gas)\n\n[21. use bytes32 for short string](#21-use-bytes32-for-short-string)\n\n[22. use fixed-size array over dynamic array](#22-use-fixed-size-array-over-dynamic-array)\n\n[23. use event to store data when possible](#23-use-event-to-store-data-when-possible)\n\n[24. use `mapping` over `array` when possible](#24-use-mapping-over-array-when-possible)\n\n## 1. use constant and immutable\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/01_Constant/Constant.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/01_Constant/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 01_Constant/Constant.t.sol --gas-report\n```\n\n**Gas report**\n\n| Function Name    | Gas Cost |\n| ---------------- | -------- |\n| varConstant      | 161 ✅ |\n| **varImmutable** | 161 ✅   |\n| variable         | 2261  |\n\n## 2. use calldata over memory\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/02_CalldataAndMemory/CalldataAndMemory.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/tree/main/02_CalldataAndMemory/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 02_CalldataAndMemory/CalldataAndMemory.T.sol --gas-report\n```\n\n**Gas report**\n\n| Function Name       | Gas Cost |\n| ------------------- | -------- |\n| **writeByCalldata** | 67905 ✅ |\n| writeByMemory       | 68456    |\n\n## 3. use Bitmap\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/03_Bitmap/Bitmap.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/03_Bitmap/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 03_Bitmap/Bitmap.T.sol --gas-report\n```\n\n**Gas report**\n\n| Function Name         | Gas Cost |\n| --------------------- | -------- |\n| **setDataWithBitmap** | 22366 ✅ |\n| setDataWithBoolArray  | 35729    |\n\n## 4. use unchecked\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/04_Unchecked/Unchecked.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/04_Unchecked/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 04_unchecked/Unchecked.T.sol --gas-report\n```\n\n**Gas report**\n\n| Function Name    | Gas Cost  |\n| ---------------- | --------- |\n| forNormal        | 1910309   |\n| **forUnckecked** | 570287 ✅ |\n\n## 5. use uint256 over uint8\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/05_Uint/Uint.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/05_Uint/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 05_Uint/Uint.T.sol --gas-report\n```\n\n**Gas report**\n\n| Function Name    | Gas Cost |\n| ---------------- | -------- |\n| read Uint8       | 2301     |\n| read Uint32     | 2301     |\n| **read Uint256** | 2261 ✅  |\n| set Uint8        | 22234     |\n| set Uint128      | 22234     |\n| **set Uint256**  | 22238  |\n| UseUint8      | 53,427     | \n| UseUint32     | 53,895     | \n| **UseUint256**    | 42,950 ✅   |\n\n## 6. use custom error over require/assert\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/06_Error/Error.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/06_Error/readme.md)\n\n**Testing**\n\n```\nforge test --contracts 06_Error/Error.T.sol --gas-report\n```\n\n**Gas report**\n\n| Error Name | Gas Cost |\n| ---------- | -------- |\n| Assert     | 180      |\n| Require    | 268      |\n| **Revert** | 164 ✅   |\n\n## 7. use local variable over storage\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/07_LocalData/LocalData.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/07_LocalData/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 07_LocalData/LocalData.T.sol --gas-report\n```\n\n**Gas report**\n\n| Data Type     | Gas Cost   |\n| ------------- | ---------- |\n| **localData** | 1902339 ✅ |\n| storageData   | 4022155    |\n\n## 8. use clone over new/create2 to deploy contract\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/08_Clone/Clone.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/08_Clone/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 08_Clone/Clone.T.sol --gas-report\n```\n\n**Gas report**\n\n| Create Type | Gas Cost |\n| ----------- | -------- |\n| **clone**  | 41493 ✅ |\n| create2     | 93031    |\n| new         | 79515    |\n\n## 9. packing storage slots\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/09_Packing/Packing.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/09_Packing/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 09_Packing/Packing.T.sol --gas-report\n```\n\n**Gas report**\n\n| Create Type | Gas Cost  |\n| ----------- | --------- |\n| normal      | 133521    |\n| **packing** | 111351 ✅ |\n\n## 10. use ++i as better increment\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/10_Increment/Increment.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/10_Increment/readme.md)\n\n```bash\nforge test --contracts 10_Increment/Increment.T.sol --gas-report\n```\n\n**Gas report**\n\n| Increment | Gas Cost |\n| --------- | -------- |\n| i += 1    | 204      |\n| i = i +1  | 204      |\n| i++       | 198      |\n| ++i       | 193 ✅   |\n\n## 11. use Uint in Reentrancy Guard\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/11_ReentrancyGuard/ReentrancyGuard.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/11_ReentrancyGuard/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 11_ReentrancyGuard/ReentrancyGuard.T.sol --gas-report\n```\n\n**Gas report**\n\n| ReentrancyGuard  | Gas Cost |           tips                    |\n| -----------------| -------- | ----------------------------------|\n| Bool             | 27757 |                                   |\n| Uint01           | 27604 | 0 to non-zero  -\u003e 20000 gas       |\n| **Uint12**       | 13908 ✅ | non-zero to non-zero  -\u003e 2900 gas |\n\n## 12. use \u003c over \u003c=\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/12_LessThan/LessThan.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/12_LessThan/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 12_LessThan/LessThan.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator    | Gas Cost |\n| ---------------- | -------- |\n| \u003c=      | 250   |\n| \u003c| 247  ✅  |\n\n\n## 13 optimized selector\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/13_MethodName/MethodName.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/13_MethodName/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 13_MethodName/MethodName.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator    | Gas Cost |\n| ---------------- | -------- |\n| regular selector 0xf8a8fd6d   | 5285   |\n| optimized selector 0x000073eb | 5265  ✅  |\n\n## 14 selector order\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/14_MethodIdSort) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/14_MethodIdSort/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 14_MethodIdSort/MethodIdSort.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| test1  0x0dbe671f | 164      |   \n| test2  0x66e41cb7 | 142      |   \n| test3  0x0a8e8e01 | 120      |   \n| test_y2K 0x000073eb | 98 ✅    | \n\n## 15 shorter string in require()\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/15_RequireString/RequireString.sol)｜[文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/15_RequireString)\n\n**Testing**\n\n```bash\nforge test --contracts 15_RequireString/RequireString.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| longString | 2578      |   \n| shortString  | 2347 ✅    |   \n\n## 16. short circuit in logic operation\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/16_ShortCircuit/ShortCircuit.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/16_ShortCircuit/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 16_ShortCircuit/ShortCircuit.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| normal | 191,282      |   \n| shortCircuit  | 120 ✅    |   \n\n## 17. delete variables to get gas refund\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/17_DeleteVar/DeleteVar.sol) | [文章](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/17_DeleteVar/readme.md)\n\n**Testing**\n\n```bash\nforge test --contracts 17_DeleteVar/DeleteVar.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| update | 22,238      |   \n| updateDefault  | 2360 ✅    |   \n| updateDelete  | 2316 ✅    |   \n\n## 18. do not initialize state variables with default values\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/18_InitDefault)\n\n**Testing**\n\n```bash\nforge test --contracts 18_InitDefault/InitDefault.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| testDefault | 67,148 ✅    |   \n| testInitDefault  | 69,376     |   \n\n\n## 19. swap 2 variables in 1 line with destructuring assignment\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/19_SwapVars)\n\n**Testing**\n\n```bash\nforge test --contracts 19_SwapVars/SwapVars.t.sol --gas-report\n```\n\n**Gas report**\n\n**This technique will not save gas, but it makes your code look better :p**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| swap | 282    |   \n| desSwap  | 282 ✅    |   \n\n## 20. set constructor to payable to save gas\n\nYou can cut out 10 opcodes in the creation-time EVM bytecode if you declare a constructor payable. The following opcodes are cut out:\n\n- `CALLVALUE`\n- `DUP1`\n- `ISZERO`\n- `PUSH2`\n- `JUMPI`\n- `PUSH1`\n- `DUP1`\n- `REVERT`\n- `JUMPDEST`\n- `POP`\n\nIn Solidity, this chunk of assembly would mean the following:\n\n```solidity\nif(msg.value != 0) revert();\n```\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/20_PayableConstructor)\n\n**Testing**\n\n```bash\nforge test --contracts 20_PayableConstructor/PayableConstructor.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| default | 67,171    |   \n| payable constructor  | 67,102 ✅    |   \n\n## 21. use bytes32 for short string\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/21_Bytes32String)\n\n**Testing**\n\n```bash\nforge test --contracts 21_Bytes32String/Bytes32String.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| setBytes32 | 22,222 ✅    |   \n| setString  | 22,682    |   \n\n## 22. use fixed-size array over dynamic array\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/22_FixedSize)\n\n**Testing**\n\n```bash\nforge test --contracts 22_FixedSize/FixedSize.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| set dynamic-length array | 2,224,770   |   \n| set fixed-length array  | 2,182,608 ✅  |   \n\n## 23. use `event` to store data when possible\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/23_Event)\n\n**Testing**\n\n```bash\nforge test --contracts 23_Event/Event.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| useVar | 22,216     |   \n| useEvent  | 1,189  ✅  |   \n\n## 24. use `mapping` over `array` when possible\n\n[Code](https://github.com/WTFAcademy/WTF-gas-optimization/blob/main/24_MappingArray)\n\n**Testing**\n\n```bash\nforge test --contracts 24_MappingArray/MappingArray.t.sol --gas-report\n```\n\n**Gas report**\n\n| Operator  | Gas Cost |\n| -------- | -------- |\n| Mapping get | 451 ✅     |   \n| Mapping insert | 22,385 ✅     |   \n| Mapping remove | 305 ✅     |   \n| Array get | 710      |   \n| Array insert | 44,442      |   \n| Array remove | 748      |   \n\n\n## WTF Gas Optimization 贡献者\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch4 align=\"center\"\u003e\n    贡献者是WTF学院的基石\n  \u003c/h4\u003e\n\u003ca href=\"https://github.com/WTFAcademy/WTF-gas-optimization/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=WTFAcademy/WTF-gas-optimization\" /\u003e\n\u003c/a\u003e\n\u003c/div\u003e\n\n## Reference\n\n1. [Solidity-Gas-Optimization-Tips](https://github.com/devanshbatham/Solidity-Gas-Optimization-Tips)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWTFAcademy%2FWTF-gas-optimization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FWTFAcademy%2FWTF-gas-optimization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWTFAcademy%2FWTF-gas-optimization/lists"}