Platform: Code4rena
Start Date: 26/05/2022
Pot Size: $75,000 USDT
Total HM: 31
Participants: 71
Period: 7 days
Judge: GalloDaSballo
Total Solo HM: 18
Id: 126
League: ETH
Rank: 62/71
Findings: 1
Award: $53.97
š Selected for report: 0
š Solo Findings: 0
š Selected for report: IllIllI
Also found by: 0x1f8b, 0x29A, 0xKitsune, 0xNazgul, 0xf15ers, 0xkatana, Cityscape, Dravee, ElKu, FSchmoede, Funen, GalloDaSballo, Hawkeye, Kaiziron, MiloTruck, Randyyy, RoiEvenHaim, Ruhum, SecureZeroX, SmartSek, TerrierLover, TomJ, Tomio, WatchPug, Waze, _Adam, asutorufos, c3phas, catchup, cogitoergosumsw, delfin454000, ellahi, fatherOfBlocks, gzeon, hansfriese, horsefacts, jonatascm, minhquanym, oyc_109, pauliax, reassor, robee, sach1r0, saian, sashik_eth, simon135, z3s
53.9653 USDT - $53.97
The following sections detail the gas optimizations found throughout the codebase. Each optimization is documented with the setup, an explainer for the optimization, a gas report and line identifiers for each optimization across the codebase. For each section's gas report, the optimizer was turned on and set to 10000 runs. You can replicate any tests/gas reports by heading to 0xKitsune/gas-lab and cloning the repo. Then, simply copy/paste the contract examples from any section and run forge test --gas-report
. You can also easily update the optimizer runs in the foundry.toml
.
contract GasTest is DSTest { Contract0 c0; Contract1 c1; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); } function testFailGas() public { c0.stringErrorMessage(); c1.customErrorMessage(); } } contract Contract0 { function stringErrorMessage() public { bool check = false; require(check, "error message"); } } contract Contract1 { error CustomError(); function customErrorMessage() public { bool check = false; if (!check) { revert CustomError(); } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 34087 ā 200 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā stringErrorMessage ā 218 ā 218 ā 218 ā 218 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 26881 ā 164 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā customErrorMessage ā 161 ā 161 ā 161 ā 161 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
BaseRewardPool.sol:122
BaseRewardPool.sol:123
BaseRewardPool.sol:124
BaseRewardPool.sol:132
BaseRewardPool.sol:173
BaseRewardPool.sol:196
BaseRewardPool.sol:215
BaseRewardPool.sol:301
Booster.sol:124
Booster.sol:130
Booster.sol:136
Booster.sol:146
Booster.sol:163
Booster.sol:169
Booster.sol:179
Booster.sol:194
Booster.sol:226
Booster.sol:231
Booster.sol:244
Booster.sol:261
Booster.sol:262
Booster.sol:309
Booster.sol:326
Booster.sol:350
Booster.sol:352
Booster.sol:360
Booster.sol:448
Booster.sol:458
Booster.sol:468
Booster.sol:477
Booster.sol:485
Booster.sol:498
Booster.sol:570
Booster.sol:604
VE3DRewardPool.sol:135
VE3DRewardPool.sol:136
VE3DRewardPool.sol:142
VE3DRewardPool.sol:210
VE3DRewardPool.sol:234
VE3DRewardPool.sol:253
VE3DRewardPool.sol:342
VeAssetDepositor.sol:132
VeAssetDepositor.sol:54
VeAssetDepositor.sol:60
VeAssetDepositor.sol:69
VeTokenMinter.sol:42
VeTokenMinter.sol:49
VoterProxy.sol:110
VoterProxy.sol:128
VoterProxy.sol:139
VoterProxy.sol:151
VoterProxy.sol:159
VoterProxy.sol:167
VoterProxy.sol:173
VoterProxy.sol:186
VoterProxy.sol:211
VoterProxy.sol:225
VoterProxy.sol:257
VoterProxy.sol:263
VoterProxy.sol:279
VoterProxy.sol:282
VoterProxy.sol:63
VoterProxy.sol:68
VoterProxy.sol:78
VoterProxy.sol:84
VoterProxy.sol:92
unchecked{++i}
instead of i++
(or use assembly when applicable)Use ++i
instead of i++
. This is especially useful in for loops but this optimization can be used anywhere in your code. You can also use unchecked{++i;}
for even more gas savings but this will not check to see if i
overflows. For extra safety if you are worried about this, you can add a require statement after the loop checking if i
is equal to the final incremented value. For best gas savings, use inline assembly, however this limits the functionality you can achieve. For example you cant use Solidity syntax to internally call your own contract within an assembly block and external calls must be done with the call()
or delegatecall()
instruction. However when applicable, inline assembly will save much more gas.
contract GasTest is DSTest { Contract0 c0; Contract1 c1; Contract2 c2; Contract3 c3; Contract4 c4; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); c2 = new Contract2(); c3 = new Contract3(); c4 = new Contract4(); } function testGas() public { c0.iPlusPlus(); c1.plusPlusI(); c2.uncheckedPlusPlusI(); c3.safeUncheckedPlusPlusI(); c4.inlineAssemblyLoop(); } } contract Contract0 { //loop with i++ function iPlusPlus() public pure { uint256 j = 0; for (uint256 i; i < 10; i++) { j++; } } } contract Contract1 { //loop with ++i function plusPlusI() public pure { uint256 j = 0; for (uint256 i; i < 10; ++i) { j++; } } } contract Contract2 { //loop with unchecked{++i} function uncheckedPlusPlusI() public pure { uint256 j = 0; for (uint256 i; i < 10; ) { j++; unchecked { ++i; } } } } contract Contract3 { //loop with unchecked{++i} with additional overflow check function safeUncheckedPlusPlusI() public pure { uint256 j = 0; uint256 i = 0; for (i; i < 10; ) { j++; unchecked { ++i; } } //check for overflow assembly { if lt(i, 10) { mstore(0x00, "loop overflow") revert(0x00, 0x20) } } } } contract Contract4 { //loop with inline assembly function inlineAssemblyLoop() public pure { assembly { let j := 0 for { let i := 0 } lt(i, 10) { i := add(i, 0x01) } { j := add(j, 0x01) } } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāāā¬āāāāāāāāā¬āāāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāāŖāāāāāāāāāŖāāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā 37687 ā 219 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā iPlusPlus ā 2039 ā 2039 ā 2039 ā 2039 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāāā“āāāāāāāāā“āāāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāāā¬āāāāāāāāā¬āāāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāāŖāāāāāāāāāŖāāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā 37287 ā 217 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā plusPlusI ā 1989 ā 1989 ā 1989 ā 1989 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāāā“āāāāāāāāā“āāāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāāā¬āāāāāāāāā¬āāāāāāā¬āāāāāāāāāā® ā Contract3 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāāŖāāāāāāāāāŖāāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā 42693 ā 244 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā safeUncheckedPlusPlusI ā 1355 ā 1355 ā 1355 ā 1355 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāāā“āāāāāāāāā“āāāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāāā¬āāāāāāāāā¬āāāāāāā¬āāāāāāāāāā® ā Contract2 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāāŖāāāāāāāāāŖāāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā 35887 ā 210 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāāā¼āāāāāāāāā¼āāāāāāā¼āāāāāāāāā⤠ā uncheckedPlusPlusI ā 1329 ā 1329 ā 1329 ā 1329 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāāā“āāāāāāāāā“āāāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract4 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 26881 ā 164 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā inlineAssemblyLoop ā 709 ā 709 ā 709 ā 709 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
BaseRewardPool.sol:176
BaseRewardPool.sol:199
BaseRewardPool.sol:218
BaseRewardPool.sol:245
BaseRewardPool.sol:282
Booster.sol:329
VE3DRewardPool.sol:148
VE3DRewardPool.sol:214
VE3DRewardPool.sol:238
VE3DRewardPool.sol:257
VE3DRewardPool.sol:281
VE3DRewardPool.sol:326
VoterProxy.sol:217
Use assembly for math instead of Solidity. You can check for overflow/underflow in assembly to ensure safety. If using Solidity versions < 0.8.0 and you are using Safemath, you can gain significant gas savings by using assembly to calculate values and checking for overflow/underflow.
contract GasTest is DSTest { Contract0 c0; Contract1 c1; Contract2 c2; Contract3 c3; Contract4 c4; Contract5 c5; Contract6 c6; Contract7 c7; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); c2 = new Contract2(); c3 = new Contract3(); c4 = new Contract4(); c5 = new Contract5(); c6 = new Contract6(); c7 = new Contract7(); } function testGas() public { c0.addTest(34598345, 100); c1.addAssemblyTest(34598345, 100); c2.subTest(34598345, 100); c3.subAssemblyTest(34598345, 100); c4.mulTest(34598345, 100); c5.mulAssemblyTest(34598345, 100); c6.divTest(34598345, 100); c7.divAssemblyTest(34598345, 100); } } contract Contract0 { //addition in Solidity function addTest(uint256 a, uint256 b) public pure { uint256 c = a + b; } } contract Contract1 { //addition in assembly function addAssemblyTest(uint256 a, uint256 b) public pure { assembly { let c := add(a, b) if lt(c, a) { mstore(0x00, "overflow") revert(0x00, 0x20) } } } } contract Contract2 { //subtraction in Solidity function subTest(uint256 a, uint256 b) public pure { uint256 c = a - b; } } contract Contract3 { //subtraction in assembly function subAssemblyTest(uint256 a, uint256 b) public pure { assembly { let c := sub(a, b) if gt(c, a) { mstore(0x00, "underflow") revert(0x00, 0x20) } } } } contract Contract4 { //multiplication in Solidity function mulTest(uint256 a, uint256 b) public pure { uint256 c = a * b; } } contract Contract5 { //multiplication in assembly function mulAssemblyTest(uint256 a, uint256 b) public pure { assembly { let c := mul(a, b) if lt(c, a) { mstore(0x00, "overflow") revert(0x00, 0x20) } } } } contract Contract6 { //division in Solidity function divTest(uint256 a, uint256 b) public pure { uint256 c = a * b; } } contract Contract7 { //division in assembly function divAssemblyTest(uint256 a, uint256 b) public pure { assembly { let c := div(a, b) if gt(c, a) { mstore(0x00, "underflow") revert(0x00, 0x20) } } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 40493 ā 233 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā addTest ā 303 ā 303 ā 303 ā 303 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 37087 ā 216 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā addAssemblyTest ā 263 ā 263 ā 263 ā 263 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract2 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 40293 ā 232 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā subTest ā 300 ā 300 ā 300 ā 300 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract3 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 37287 ā 217 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā subAssemblyTest ā 263 ā 263 ā 263 ā 263 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract4 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 41893 ā 240 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā mulTest ā 325 ā 325 ā 325 ā 325 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract5 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 37087 ā 216 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā mulAssemblyTest ā 265 ā 265 ā 265 ā 265 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract6 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 41893 ā 240 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā divTest ā 325 ā 325 ā 325 ā 325 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract7 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 37287 ā 217 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā divAssemblyTest ā 265 ā 265 ā 265 ā 265 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
BaseRewardPool.sol:311
BaseRewardPool.sol:314
BaseRewardPool.sol:59
VE3DRewardPool.sol:352
VeAssetDepositor.sol:103
VeAssetDepositor.sol:18
VeAssetDepositor.sol:74
VeTokenMinter.sol:15
Solidity >= 0.8.0 checks for overflow/underflow by default. Using Safemath when using version >= 0.8.0 is redundant and will incur additional gas costs. Instead of safemath, you can simply use Solidity's built in arithmetic. For further gas savings, you can also use assembly and check for overflow/underflow as seen below.
contract GasTest is DSTest { Contract0 c0; Contract1 c1; Contract2 c2; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); c2 = new Contract2(); } function testGas() public { uint256 a = 109230923590; uint256 b = 928359823498234; c0.safeMathAdd(a, b); c1.standardAdd(a, b); c2.assemblyAdd(a, b); } } contract Contract0 { using SafeMath for uint256; function safeMathAdd(uint256 a, uint256 b) public { uint256 c = a.add(b); } } contract Contract1 { function standardAdd(uint256 a, uint256 b) public { uint256 c = a + b; } } contract Contract2 { function assemblyAdd(uint256 a, uint256 b) public { assembly { let c := add(a, b) } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 48899 ā 275 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā safeMathAdd ā 348 ā 348 ā 348 ā 348 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 45499 ā 258 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā standardAdd ā 303 ā 303 ā 303 ā 303 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract2 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 41293 ā 237 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā assemblyAdd ā 263 ā 263 ā 263 ā 263 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
BaseRewardPool.sol:157
BaseRewardPool.sol:158
BaseRewardPool.sol:167
BaseRewardPool.sol:168
BaseRewardPool.sol:169
BaseRewardPool.sol:180
BaseRewardPool.sol:181
BaseRewardPool.sol:204
BaseRewardPool.sol:205
BaseRewardPool.sol:222
BaseRewardPool.sol:223
BaseRewardPool.sol:249
BaseRewardPool.sol:250
BaseRewardPool.sol:296
BaseRewardPool.sol:303
BaseRewardPool.sol:312
BaseRewardPool.sol:315
BaseRewardPool.sol:317
BaseRewardPool.sol:328
BaseRewardPool.sol:330
BaseRewardPool.sol:332
BaseRewardPool.sol:333
BaseRewardPool.sol:334
BaseRewardPool.sol:335
BaseRewardPool.sol:339
BaseRewardPool.sol:344
Booster.sol:228
Booster.sol:518
Booster.sol:519
Booster.sol:520
Booster.sol:523
Booster.sol:528
Booster.sol:529
Booster.sol:535
Booster.sol:536
Booster.sol:537
Booster.sol:538
Booster.sol:582
Booster.sol:583
Booster.sol:607
VE3DRewardPool.sol:111
VE3DRewardPool.sol:115
VE3DRewardPool.sol:176
VE3DRewardPool.sol:178
VE3DRewardPool.sol:179
VE3DRewardPool.sol:180
VE3DRewardPool.sol:181
VE3DRewardPool.sol:188
VE3DRewardPool.sol:189
VE3DRewardPool.sol:193
VE3DRewardPool.sol:194
VE3DRewardPool.sol:202
VE3DRewardPool.sol:206
VE3DRewardPool.sol:219
VE3DRewardPool.sol:221
VE3DRewardPool.sol:243
VE3DRewardPool.sol:245
VE3DRewardPool.sol:261
VE3DRewardPool.sol:262
VE3DRewardPool.sol:344
VE3DRewardPool.sol:353
VE3DRewardPool.sol:354
VE3DRewardPool.sol:358
VE3DRewardPool.sol:373
VE3DRewardPool.sol:375
VE3DRewardPool.sol:376
VE3DRewardPool.sol:377
VE3DRewardPool.sol:378
VE3DRewardPool.sol:382
VeAssetDepositor.sol:106
VeAssetDepositor.sol:140
VeAssetDepositor.sol:147
VeAssetDepositor.sol:148
VeAssetDepositor.sol:151
VeTokenMinter.sol:29
VeTokenMinter.sol:33
VeTokenMinter.sol:57
VeTokenMinter.sol:61
VeTokenMinter.sol:63
VeTokenMinter.sol:66
VoterProxy.sol:131
VoterProxy.sol:132
VoterProxy.sol:140
require()
statments insted of require(expression && expression && ...)
contract GasTest is DSTest { Contract0 c0; Contract1 c1; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); } function testGas() public { c0.singleRequire(3); c1.multipleRequire(3); } } contract Contract0 { function singleRequire(uint256 num) public { require(num > 1 && num < 10 && num == 3); } } contract Contract1 { function multipleRequire(uint256 num) public { require(num > 1); require(num < 10); require(num == 3); } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 35487 ā 208 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā singleRequire ā 286 ā 286 ā 286 ā 286 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 35887 ā 210 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā multipleRequire ā 270 ā 270 ā 270 ā 270 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
Booster.sol:261
Booster.sol:262
contract GasTest is DSTest { Contract0 c0; Contract1 c1; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); } function testGas() public view { c0.solidityHash(2309349, 2304923409); c1.assemblyHash(2309349, 2304923409); } } contract Contract0 { function solidityHash(uint256 a, uint256 b) public view { //unoptimized keccak256(abi.encodePacked(a, b)); } } contract Contract1 { function assemblyHash(uint256 a, uint256 b) public view { //optimized assembly { mstore(0x00, a) mstore(0x20, b) let hashedVal := keccak256(0x00, 0x40) } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 36687 ā 214 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā solidityHash ā 313 ā 313 ā 313 ā 313 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 31281 ā 186 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā assemblyHash ā 231 ā 231 ā 231 ā 231 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
contract GasTest is DSTest { Contract0 c0; Contract1 c1; function setUp() public { c0 = new Contract0(); c1 = new Contract1(); } function testGas() public view { c0.ownerNotZero(address(this)); c1.assemblyOwnerNotZero(address(this)); } } contract Contract0 { function ownerNotZero(address _addr) public pure { require(_addr != address(0), "zero address)"); } } contract Contract1 { function assemblyOwnerNotZero(address _addr) public pure { assembly { if iszero(_addr) { mstore(0x00, "zero address") revert(0x00, 0x20) } } } }
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract0 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 61311 ā 338 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā ownerNotZero ā 258 ā 258 ā 258 ā 258 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāā⯠āāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāā¬āāāāāā¬āāāāāāāāā¬āāāāāā¬āāāāāāāāāā® ā Contract1 contract ā ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāāŖāāāāāāāāāāāāāāāāāāŖāāāāāāŖāāāāāāāāāŖāāāāāāŖāāāāāāāāāā” ā Deployment Cost ā Deployment Size ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā 44893 ā 255 ā ā ā ā ā āāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā Function Name ā min ā avg ā median ā max ā # calls ā āāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāā¼āāāāāā¼āāāāāāāāā¼āāāāāā¼āāāāāāāāā⤠ā assemblyOwnerNotZero ā 252 ā 252 ā 252 ā 252 ā 1 ā ā°āāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāā“āāāāāā“āāāāāāāāā“āāāāāā“āāāāāāāāāāÆ
BaseRewardPool.sol:123
BaseRewardPool.sol:140
Booster.sol:151
Booster.sol:183
Booster.sol:262
Booster.sol:297
Booster.sol:360
Booster.sol:365
Booster.sol:417
Booster.sol:507
Booster.sol:526
VE3DRewardPool.sol:136
VE3DRewardPool.sol:152
VeAssetDepositor.sol:154
VoterProxy.sol:70
VoterProxy.sol:85
#0 - GalloDaSballo
2022-07-14T01:47:44Z
Will save at most 3k gas, missing immutable variables massively penalized the report.
Also please find a way to send the list in a more concise way