Platform: Code4rena
Start Date: 09/09/2022
Pot Size: $42,000 USDC
Total HM: 2
Participants: 101
Period: 3 days
Judge: hickuphh3
Total Solo HM: 2
Id: 161
League: ETH
Rank: 68/101
Findings: 1
Award: $33.58
๐ Selected for report: 0
๐ Solo Findings: 0
๐ Selected for report: GalloDaSballo
Also found by: 0x040, 0x1f8b, 0x4non, 0x52, 0x85102, 0xNazgul, 0xSky, 0xSmartContract, Aymen0909, Bnke0x0, CertoraInc, Chandr, Chom, CodingNameKiki, Deivitto, Diana, Funen, JC, Jeiwan, Junnon, KIntern_NA, Lambda, Mohandes, Noah3o6, Ocean_Sky, Picodes, R2, Randyyy, RaymondFam, ReyAdmirado, Rohan16, Rolezn, Samatak, Sm4rty, SnowMan, SooYa, StevenL, Tagir2003, Tointer, TomJ, Tomo, V_B, Waze, _Adam, __141345__, a12jmx, ajtra, ak1, asutorufos, bharg4v, bobirichman, brgltd, c3phas, cccz, cryptonue, cryptostellar5, cryptphi, csanuragjain, d3e4, datapunk, delfin454000, dipp, djxploit, durianSausage, erictee, fatherOfBlocks, gogo, got_targ, hansfriese, horsefacts, hyh, ignacio, innertia, izhuer, karanctf, ladboy233, leosathya, lucacez, lukris02, mics, oyc_109, pashov, pauliax, prasantgupta52, rbserver, ret2basic, rfa, robee, rokinot, rotcivegaf, rvierdiiev, sach1r0, scaraven, sikorico, simon135, smiling_heretic, sorrynotsorry, unforgiven, wagmi, yixxas
33.5762 USDC - $33.58
The interface and the function should require a start index and a lenght, so that the index composition can be fetched in batches without running out of gas. If there are thousands of index components (e.g. like the Wilshire 5000 index), the function may revert
2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::137-145 => function _configureMerkleRoots(address[] memory _cTokens, bytes32[] memory _roots) internal { require(_cTokens.length == 27, "Must provide exactly 27 merkle roots"); require(_cTokens.length == _roots.length, "Merkle roots must be provided for each cToken"); for (uint256 i = 0; i < _cTokens.length; i++) { require(_roots[i] != bytes32(0), "Merkle root must be non-zero"); merkleRoots[_cTokens[i]] = _roots[i]; } }
address(0x0)
when assigning values to address
state variables2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::133 => cTokenExchangeRates[_cTokens[i]] = _exchangeRates[i]; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::138 => require(_cTokens.length == 27, "Must provide exactly 27 merkle roots"); 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::139 => require(_cTokens.length == _roots.length, "Merkle roots must be provided for each cToken"); 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::143 => merkleRoots[_cTokens[i]] = _roots[i]; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::149 => baseToken = _baseToken; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::158 => userSignatures[msg.sender] = _signature; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::178 => claims[msg.sender][_cToken] = _amount; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::32 => redeemedToken = _redeemedToken; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::33 => tokensReceived = _tokensReceived; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::34 => redeemBase = _redeemBase;
Avoid floating pragmas for non-library contracts.
While floating pragmas make sense for libraries to allow them to be included with multiple different versions of applications, it may be a security risk for application implementations.
A known vulnerable compiler version may accidentally be selected or security tools might fall-back to an older compiler version ending up checking a different EVM compilation that is ultimately deployed on the blockchain.
It is recommended to pin to a concrete compiler version.
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::2 => pragma solidity ^0.8.4; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::2 => pragma solidity ^0.8.4;
Issue Information: (https://github.com/Bnke0x0/c4-common-issues/blob/main/2-Low-Risk.md#n001---Adding-a-return-statement-when-the-function-defines-a-named-return-variable,-is-redundant)
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::67 => return amountIn; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::39 => return tokensReceived;
2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::85 => return (cTokenExchangeRates[cToken] * amount) / 1e18;
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::2 => pragma solidity ^0.8.4; 2022-09-tribe/contracts/shutdown/fuse/MerkleRedeemerDripper.sol::2 => pragma solidity =0.8.10; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::2 => pragma solidity =0.8.10; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::2 => pragma solidity ^0.8.4;
Use a solidity version of at least 0.8.13 to get the ability to use using for with a list of free functions
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::16 => using SafeERC20 for Fei; 2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::17 => using SafeERC20 for IERC20; 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::16 => using SafeERC20 for IERC20; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::11 => using SafeERC20 for IERC20;
indexed
fieldsEach event
should use three indexed
fields if there are three or more fields
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::27 => event Redeem(address to, uint256 amountFeiIn, uint256 amountAssetOut); 2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::29 => event Mint(address to, uint256 amountIn, uint256 amountFeiOut); 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::14 => event Redeemed(address indexed owner, address indexed receiver, uint256 amount, uint256 base);
public
functions not called by the contract should be declared external
insteadContracts are allowed to override their parentsโ functions and change the visibility from external to public.
2022-09-tribe/contracts/shutdown/fuse/MerkleRedeemerDripper.sol::21 => function drip() public override { 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::81 => function previewRedeem(address cToken, uint256 amount) public view override returns (uint256 baseTokenAmount) { 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::38 => function tokensReceivedOnRedeem() public view returns (address[] memory) {
Consider defining in only one contract so that values cannot become out of sync when only one location is updated
2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::174 => bytes32 leafHash = keccak256(abi.encodePacked(msg.sender, _amount));
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::2 => pragma solidity ^0.8.4; 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::2 => pragma solidity ^0.8.4;
2022-09-tribe/contracts/peg/SimpleFeiDaiPSM.sol::1 => // SPDX-License-Identifier: GPL-3.0-or-later 2022-09-tribe/contracts/shutdown/fuse/MerkleRedeemerDripper.sol::1 => // SPDX-License-Identifier: GPL-3.0-or-later 2022-09-tribe/contracts/shutdown/fuse/RariMerkleRedeemer.sol::1 => // SPDX-License-Identifier: GPL-3.0-or-later 2022-09-tribe/contracts/shutdown/redeem/TribeRedeemer.sol::1 => // SPDX-License-Identifier: GPL-3.0-or-later