Platform: Code4rena
Start Date: 22/09/2023
Pot Size: $100,000 USDC
Total HM: 15
Participants: 175
Period: 14 days
Judge: alcueca
Total Solo HM: 4
Id: 287
League: ETH
Rank: 126/175
Findings: 1
Award: $17.71
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: rvierdiiev
Also found by: 0x11singh99, 0xAnah, 0xta, Aamir, DavidGiladi, DevABDee, Eurovickk, JCK, K42, MrPotatoMagic, Pessimistic, Raihan, Rolezn, SM3_SS, SY_S, Sathish9098, Udsen, ayo_dev, blutorque, c3phas, clara, dharma09, hihen, hunter_w3b, jamshed, koxuan, lsaudit, marqymarq10, oualidpro, pfapostol, sivanesh_808, tabriz, wahedtalash77, zabihullahazadzoi, ziyou-
17.7101 USDC - $17.71
Issue | Instances | |
---|---|---|
GAS-1 | Cache array length outside of loop | 8 |
GAS-2 | Replace ERC721 with ERC721A | 1 |
GAS-3 | Long revert strings | 16 |
GAS-4 | Use mappings over arrays | 50 |
If not cached, the solidity compiler will always read the length of the array during each iteration. That is, if it is a storage array, this is an extra sload operation (100 additional extra gas for each iteration except for the first) and if it is a memory array, this is an extra mload operation (3 additional gas for each iteration except for the first).
Instances (8):
File: BaseBranchRouter.sol 192: for (uint256 i = 0; i < _hTokens.length;) {
File: BranchBridgeAgent.sol 447: for (uint256 i = 0; i < deposit.tokens.length;) {
File: MulticallRootRouter.sol 278: for (uint256 i = 0; i < outputParams.outputTokens.length;) { 367: for (uint256 i = 0; i < outputParams.outputTokens.length;) { 455: for (uint256 i = 0; i < outputParams.outputTokens.length;) { 557: for (uint256 i = 0; i < outputTokens.length;) {
File: RootBridgeAgent.sol 318: for (uint256 i = 0; i < settlement.hTokens.length;) { 1070: for (uint256 i = 0; i < hTokens.length;) {
ERC721A is more gas efficient when minting a lot of NFTs at the same time. Consider replacing ERC721A with ERC721.
Instances (1):
File: VirtualAccount.sol 7: import {ERC721} from "solmate/tokens/ERC721.sol";
Instances (16):
File: BranchBridgeAgent.sol 125: require(_rootBridgeAgentAddress != address(0), "Root Bridge Agent Address cannot be the zero address."); 130: require(_localRouterAddress != address(0), "Local Router Address cannot be the zero address."); 131: require(_localPortAddress != address(0), "Local Port Address cannot be the zero address.");
File: BranchPort.sol 127: require(_bridgeAgentFactory != address(0), "BridgeAgentFactory is zero address");
File: RootBridgeAgent.sol 111: require(_lzEndpointAddress != address(0), "Layerzero Enpoint Address cannot be zero address"); 112: require(_localPortAddress != address(0), "Port Address cannot be zero address"); 113: require(_localRouterAddress != address(0), "Router Address cannot be zero address");
File: RootPort.sol 130: require(_bridgeAgentFactory != address(0), "Bridge Agent Factory cannot be 0 address."); 131: require(_coreRootRouter != address(0), "Core Root Router cannot be 0 address."); 152: require(_coreRootBridgeAgent != address(0), "Core Root Bridge Agent cannot be 0 address."); 153: require(_coreLocalBranchBridgeAgent != address(0), "Core Local Branch Bridge Agent cannot be 0 address."); 154: require(_localBranchPortAddress != address(0), "Local Branch Port Address cannot be 0 address.");
File: factories/ArbitrumBranchBridgeAgentFactory.sol 57: require(_coreRootBridgeAgent != address(0), "Core Root Bridge Agent Address cannot be 0");
File: factories/BranchBridgeAgentFactory.sol 61: require(_rootBridgeAgentFactoryAddress != address(0), "Root Bridge Agent Factory Address cannot be 0"); 66: require(_localCoreBranchRouterAddress != address(0), "Core Branch Router Address cannot be 0"); 88: require(_coreRootBridgeAgent != address(0), "Core Root Bridge Agent cannot be 0");
Arrays uses more gas than mappings. Consider using mappings whenever possible.
Instances (50):
File: BaseBranchRouter.sol 187: address[] memory _hTokens, 188: address[] memory _tokens,
File: BranchBridgeAgent.sol 507: address[] memory _hTokens = new address[](numOfAssets); 507: address[] memory _hTokens = new address[](numOfAssets); 508: address[] memory _tokens = new address[](numOfAssets); 508: address[] memory _tokens = new address[](numOfAssets); 827: address[] memory addressArray = new address[](1); 827: address[] memory addressArray = new address[](1); 863: address[] memory _hTokens, 864: address[] memory _tokens,
File: BranchPort.sol 35: address[] public bridgeAgents; 45: address[] public bridgeAgentFactories; 55: address[] public strategyTokens; 71: address[] public portStrategies; 248: address[] memory _localAddresses, 249: address[] memory _underlyingAddresses, 290: address[] memory _localAddresses, 291: address[] memory _underlyingAddresses,
File: MulticallRootRouter.sol 32: address[] outputTokens; 547: address[] memory outputTokens,
File: RootBridgeAgent.sol 858: address[] memory _hTokens, 859: address[] memory _tokens, 1007: address[] memory addressArray = new address[](1); 1007: address[] memory addressArray = new address[](1); 1050: address[] memory _globalAddresses, 1067: address[] memory hTokens = new address[](_globalAddresses.length); 1067: address[] memory hTokens = new address[](_globalAddresses.length); 1068: address[] memory tokens = new address[](_globalAddresses.length); 1068: address[] memory tokens = new address[](_globalAddresses.length);
File: RootBridgeAgentExecutor.sol 276: address[] memory hTokens = new address[](numOfAssets); 276: address[] memory hTokens = new address[](numOfAssets); 277: address[] memory tokens = new address[](numOfAssets); 277: address[] memory tokens = new address[](numOfAssets);
File: RootPort.sol 67: address[] public bridgeAgents; 80: address[] public bridgeAgentFactories;
File: interfaces/BridgeAgentStructs.sol 16: address[] hTokens; 17: address[] tokens; 32: address[] hTokens; //Input Local hTokens Address. 33: address[] tokens; //Input Native / underlying Token Address. 42: address[] hTokens; //Input Local hTokens Address. 43: address[] tokens; //Input Native / underlying Token Address. 62: address[] hTokens; //Input Local hTokens Addresses. 63: address[] tokens; //Input Native / underlying Token Addresses. 75: address[] globalAddresses; //Input Global hTokens Addresses. 93: address[] hTokens; // Input Local hTokens Addresses. 94: address[] tokens; // Input Native / underlying Token Addresses.
File: interfaces/IBranchPort.sol 105: address[] memory _localAddresses, 106: address[] memory _underlyingAddresses, 137: address[] memory _localAddresses, 138: address[] memory _underlyingAddresses,
#0 - 0xA5DF
2023-10-15T17:33:53Z
G1, G3 in bot report
#1 - c4-pre-sort
2023-10-15T17:36:10Z
0xA5DF marked the issue as sufficient quality report
#2 - c4-judge
2023-10-26T13:42:08Z
alcueca marked the issue as grade-c
#3 - c4-judge
2023-10-26T13:42:17Z
alcueca marked the issue as grade-b