Platform: Code4rena
Start Date: 22/09/2022
Pot Size: $30,000 USDC
Total HM: 12
Participants: 133
Period: 3 days
Judge: 0xean
Total Solo HM: 2
Id: 165
League: ETH
Rank: 73/133
Findings: 2
Award: $40.83
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: rotcivegaf
Also found by: 0x040, 0x1f8b, 0x4non, 0xNazgul, 0xSmartContract, 0xf15ers, 8olidity, Aymen0909, B2, Bahurum, Bnke0x0, Ch_301, CodingNameKiki, Deivitto, Diana, Funen, IllIllI, JC, JLevick, KIntern_NA, Lambda, OptimismSec, PaludoX0, RockingMiles, Rolezn, Sm4rty, Soosh, Tagir2003, Tointer, TomJ, Triangle, Trust, V_B, Waze, Yiko, __141345__, a12jmx, ajtra, asutorufos, ayeslick, aysha, bbuddha, bharg4v, bobirichman, brgltd, bytera, c3phas, cryptostellar5, cryptphi, csanuragjain, datapunk, delfin454000, durianSausage, exd0tpy, gogo, got_targ, jag, joestakey, karanctf, ladboy233, leosathya, lukris02, mics, millersplanet, natzuu, neko_nyaa, obront, oyc_109, parashar, peritoflores, rbserver, ret2basic, rokinot, ronnyx2017, rvierdiiev, sach1r0, seyni, sikorico, slowmoses, tnevler, yasir, yongskiws
28.0141 USDC - $28.01
This is probably an oversight since SafeERC20 was imported and safeTransfer() was used for ERC20 token transfers. Nevertheless, note that approve() will fail for certain token implementations that do not return a boolean value (). Hence it is recommend to use safeApprove().
frxETHMinter.sol:75: frxETHToken.approve(address(sfrxETHToken), msg.value);
require error msg
frxETHMinter.sol:79: require(sfrxeth_recieved > 0, 'No sfrxETH was returned');
🌟 Selected for report: pfapostol
Also found by: 0x040, 0x1f8b, 0x4non, 0x5rings, 0xA5DF, 0xNazgul, 0xSmartContract, 0xmatt, 0xsam, Amithuddar, Aymen0909, B2, Ben, Bnke0x0, Chom, CodingNameKiki, Deivitto, Diana, Fitraldys, Funen, IllIllI, JAGADESH, JC, Metatron, Ocean_Sky, PaludoX0, Pheonix, RaymondFam, ReyAdmirado, RockingMiles, Rohan16, Rolezn, Satyam_Sharma, Sm4rty, SnowMan, SooYa, Tagir2003, TomJ, Tomio, Triangle, V_B, Waze, __141345__, ajtra, albincsergo, asutorufos, aysha, beardofginger, bobirichman, brgltd, bulej93, bytera, c3phas, ch0bu, cryptostellar5, cryptphi, d3e4, delfin454000, dharma09, drdr, durianSausage, emrekocak, erictee, fatherOfBlocks, gogo, got_targ, imare, jag, karanctf, ladboy233, leosathya, lukris02, medikko, mics, millersplanet, natzuu, neko_nyaa, oyc_109, peanuts, prasantgupta52, rbserver, ret2basic, rokinot, ronnyx2017, rotcivegaf, sach1r0, samruna, seyni, slowmoses, tnevler, wagmi, zishansami
12.8158 USDC - $12.82
frxETHMinter.sol:129: for (uint256 i = 0; i < numDeposits; ++i) { OperatorRegistry.sol:63: for (uint256 i = 0; i < arrayLength; ++i) { OperatorRegistry.sol:84: for (uint256 i = 0; i < times; ++i) { OperatorRegistry.sol:114: for (uint256 i = 0; i < original_validators.length; ++i) {
ERC20/ERC20PermitPermissionedMint.sol:84: for (uint i = 0; i < minters_array.length; i++){
ERC20/ERC20PermitPermissionedMint.sol:84: for (uint i = 0; i < minters_array.length; i++){ OperatorRegistry.sol:114: for (uint256 i = 0; i < original_validators.length; ++i) {
uints are 0
by default.removeing this will reduce contract size and save a bit of gas.ERC20/ERC20PermitPermissionedMint.sol:84: for (uint i = 0; i < minters_array.length; i++){ frxETHMinter.sol:129: for (uint256 i = 0; i < numDeposits; ++i) { OperatorRegistry.sol:63: for (uint256 i = 0; i < arrayLength; ++i) { OperatorRegistry.sol:84: for (uint256 i = 0; i < times; ++i) { OperatorRegistry.sol:114: for (uint256 i = 0; i < original_validators.length; ++i) {
public
functions not called by the contract should be declared external
insteadxERC4626.sol:45: function totalAssets() public view override returns (uint256) { ERC20/ERC20PermitPermissionedMint.sol:65: function addMinter(address minter_address) public onlyByOwnGov { ERC20/ERC20PermitPermissionedMint.sol:76: function removeMinter(address minter_address) public onlyByOwnGov { ERC20/ERC20PermitPermissionedMint.sol:94: function setTimelock(address _timelock_address) public onlyByOwnGov { sfrxETH.sol:54: function pricePerShare() public view returns (uint256) { OperatorRegistry.sol:82: function popValidators(uint256 times) public onlyByOwnGov {
ERC20/ERC20PermitPermissionedMint.sol:46: require(minters[msg.sender] == true, "Only minters"); ERC20/ERC20PermitPermissionedMint.sol:68: require(minters[minter_address] == false, "Address already exists"); ERC20/ERC20PermitPermissionedMint.sol:78: require(minters[minter_address] == true, "Address nonexistant"); OperatorRegistry.sol:182: require(numValidators() == 0, "Clear validator array first");
!= 0
instead of > 0
frxETHMinter.sol:79: require(sfrxeth_recieved > 0, 'No sfrxETH was returned'); frxETHMinter.sol:126: require(numDeposits > 0, "Not enough ETH in contract");
costs more gas than
<x> = <x> + <y>`xERC4626.sol:67: storedTotalAssets -= amount; xERC4626.sol:72: storedTotalAssets += amount; frxETHMinter.sol:97: currentWithheldETH += withheld_amt; frxETHMinter.sol:168: currentWithheldETH -= amount;