Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gas Optimizations #92

Open
code423n4 opened this issue Aug 3, 2022 · 2 comments
Open

Gas Optimizations #92

code423n4 opened this issue Aug 3, 2022 · 2 comments

Comments

@code423n4
Copy link
Contributor

Variables should not be initialized to defaults (uint256 default is 0):
contracts/AxelarGateway.sol::207 => for (uint256 i = 0; i < symbols.length; i++) {
contracts/auth/AxelarAuthWeighted.sol::68 => uint256 totalWeight = 0;
contracts/auth/AxelarAuthWeighted.sol::69 => for (uint256 i = 0; i < weightsLength; ++i) {
contracts/auth/AxelarAuthWeighted.sol::94 => uint256 operatorIndex = 0;
contracts/auth/AxelarAuthWeighted.sol::95 => uint256 weight = 0;
contracts/auth/AxelarAuthWeighted.sol::98 => for (uint256 i = 0; i < signatures.length; ++i) {

Length of array should be computed outside of for-loop:
contracts/AdminMultisigBase.sol::149 => uint256 adminLength = accounts.length;
contracts/AxelarGateway.sol::49 => if (authModule.code.length == 0) revert InvalidAuthModule();
contracts/AxelarGateway.sol::50 => if (tokenDeployerImplementation.code.length == 0) revert InvalidTokenDeployer();
contracts/AxelarGateway.sol::205 => if (symbols.length != limits.length) revert InvalidSetDailyMintLimitsParams();
contracts/AxelarGateway.sol::207 => for (uint256 i = 0; i < symbols.length; i++) {
contracts/AxelarGateway.sol::228 => if (setupParams.length != 0) {
contracts/AxelarGateway.sol::255 => if (newOperatorsData.length > 0) {
contracts/AxelarGateway.sol::288 => uint256 commandsLength = commandIds.length;
contracts/AxelarGateway.sol::290 => if (commandsLength != commands.length || commandsLength != params.length) revert InvalidCommands();
contracts/AxelarGateway.sol::355 => if (tokenAddress.code.length == uint256(0)) revert TokenContractDoesNotExist(tokenAddress);
contracts/AxelarGateway.sol::388 => if (!success || (returnData.length != uint256(0) && !abi.decode(returnData, (bool)))) revert BurnFailed(symbol);
contracts/AxelarGateway.sol::462 => return success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/AxelarGatewayProxy.sol::19 => if (gatewayImplementation.code.length == 0) revert InvalidImplementation();
contracts/DepositHandler.sol::23 => if (callee.code.length == 0) revert NotContract();
contracts/ECDSA.sol::32 => // Check the signature length
contracts/ECDSA.sol::33 => if (signature.length != 65) revert InvalidSignatureLength();
contracts/ECDSA.sol::75 => // 32 is the length in bytes of hash,
contracts/auth/AxelarAuthWeighted.sol::17 => for (uint256 i; i < recentOperators.length; ++i) {
contracts/auth/AxelarAuthWeighted.sol::60 => uint256 operatorsLength = newOperators.length;
contracts/auth/AxelarAuthWeighted.sol::61 => uint256 weightsLength = newWeights.length;
contracts/auth/AxelarAuthWeighted.sol::93 => uint256 operatorsLength = operators.length;
contracts/auth/AxelarAuthWeighted.sol::98 => for (uint256 i = 0; i < signatures.length; ++i) {
contracts/auth/AxelarAuthWeighted.sol::116 => for (uint256 i; i < accounts.length - 1; ++i) {
contracts/deposit-service/AxelarDepositService.sol::114 => for (uint256 i; i < refundTokens.length; i++) {
contracts/deposit-service/AxelarDepositService.sol::168 => for (uint256 i; i < refundTokens.length; i++) {
contracts/deposit-service/AxelarDepositService.sol::204 => for (uint256 i; i < refundTokens.length; i++) {
contracts/deposit-service/DepositBase.sol::32 => if (symbolBytes.length == 0 || symbolBytes.length > 31) revert InvalidSymbol();
contracts/deposit-service/DepositBase.sol::36 => // Storing string length as the last byte of the data
contracts/deposit-service/DepositBase.sol::37 => symbolNumber |= 0xff & symbolBytes.length;
contracts/deposit-service/DepositBase.sol::49 => // recovering string length as the last byte of the data
contracts/deposit-service/DepositBase.sol::50 => uint256 length = 0xff & uint256(symbolData);
contracts/deposit-service/DepositBase.sol::52 => // restoring the string with the correct length
contracts/deposit-service/DepositBase.sol::58 => // store length in memory
contracts/deposit-service/DepositBase.sol::59 => mstore(symbol, length)
contracts/deposit-service/DepositBase.sol::72 => bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/deposit-service/DepositBase.sol::74 => if (!transferred || tokenAddress.code.length == 0) revert TokenTransferFailed();
contracts/gas-service/AxelarGasService.sol::123 => for (uint256 i; i < tokens.length; i++) {
contracts/gas-service/AxelarGasService.sol::159 => bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/gas-service/AxelarGasService.sol::161 => if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
contracts/gas-service/AxelarGasService.sol::175 => bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/gas-service/AxelarGasService.sol::177 => if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
contracts/interfaces/IAxelarForecallable.sol::133 => bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/interfaces/IAxelarForecallable.sol::135 => if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
contracts/interfaces/IAxelarForecallable.sol::146 => bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
contracts/interfaces/IAxelarForecallable.sol::148 => if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
contracts/util/Upgradable.sol::50 => if (params.length > 0) {

!= is more efficient than > 0 for uint comparisons:
contracts/AxelarGateway.sol::255 => if (newOperatorsData.length > 0) {
contracts/AxelarGateway.sol::613 => if (limit > 0 && amount > limit) revert ExceedDailyMintLimit(symbol);
contracts/ECDSA.sol::58 => if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidS();
contracts/ERC20Permit.sol::45 => if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidS();
contracts/auth/AxelarAuthWeighted.sol::76 => if (epochForHash[newOperatorsHash] > 0) revert SameOperators();
contracts/deposit-service/AxelarDepositService.sol::165 => if (addressForNativeDeposit(salt, refundAddress, destinationChain, destinationAddress).balance > 0 && msg.sender != refundAddress)
contracts/deposit-service/ReceiverImplementation.sol::23 => if (address(this).balance > 0) refundAddress.transfer(address(this).balance);
contracts/deposit-service/ReceiverImplementation.sol::51 => if (address(this).balance > 0) refundAddress.transfer(address(this).balance);
contracts/deposit-service/ReceiverImplementation.sol::71 => if (address(this).balance > 0) refundAddress.transfer(address(this).balance);
contracts/gas-service/AxelarGasService.sol::128 => if (amount > 0) receiver.transfer(amount);
contracts/gas-service/AxelarGasService.sol::131 => if (amount > 0) _safeTransfer(token, receiver, amount);
contracts/util/Upgradable.sol::50 => if (params.length > 0) {

Switching from division/multiplication to right-shift/left-shift can save gas:
contracts/ECDSA.sol::56 => // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
contracts/ERC20.sol::15 => * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
contracts/interfaces/IERC20.sol::49 => * ethereum/EIPs#20 (comment)
contracts/test/gmp/DestinationChainTokenSwapper.sol::29 => convertedAmount = amount * 2;
contracts/test/gmp/DestinationChainTokenSwapper.sol::33 => convertedAmount = amount / 2;

code423n4 added a commit that referenced this issue Aug 3, 2022
@re1ro
Copy link
Member

re1ro commented Aug 5, 2022

Dup #2

Switching from division/multiplication to right-shift/left-shift can save gas:

Ack

@GalloDaSballo
Copy link
Collaborator

This is really low quality and I'll penalize.

Less than 100 gas saved

Please preview your submissions on a markdown reader

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants