You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[G-02] .length should not be looked up in every loop of a for-loop:-
1. File: 2022-07-ens/contracts/dnssec-oracle/DNSSECImpl.sol (line 93):
`for(uint i = 0; i < input.length; i++) {`
2. File: 2022-07-ens/contracts/dnssec-oracle/RRUtils.sol (line 310):
`for(uint i = 0; i < data.length + 31; i += 32) {`
3. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 256):
`for (uint256 i = 0; i < data.length; i++) {`
4. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 92):
`for (uint256 i = 0; i < accounts.length; ++i) {`
5. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 205):
`for (uint256 i = 0; i < ids.length; ++i) {`
[G-03] ++i costs less gas than i++, especially when it’s used in for-loops (--i/i-- too):-
1. File: 2022-07-ens/contracts/dnssec-oracle/DNSSECImpl.sol (line 93):
`for(uint i = 0; i < input.length; i++) {`
2. File: 2022-07-ens/contracts/dnssec-oracle/RRUtils.sol (line 310):
`for(uint i = 0; i < data.length + 31; i += 32) {`
3. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 256):
`for (uint256 i = 0; i < data.length; i++) {`
4. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 92):
`for (uint256 i = 0; i < accounts.length; ++i) {`
5. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 205):
`for (uint256 i = 0; i < ids.length; ++i) {`
[G-04] require()/revert() strings longer than 32 bytes cost extra gas:-
1. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 327):
`revert("ERC1155: transfer to non ERC1155Receiver implementer");`
2. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 354):
`revert("ERC1155: ERC1155Receiver rejected tokens");`
3. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 359):
`revert("ERC1155: transfer to non ERC1155Receiver implementer");`
4. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 99-102):
`require(
resolver != address(0),
"ETHRegistrarController: resolver is required when data is supplied"
);`
5. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 137-140):
`require(
msg.value >= (price.base + price.premium),
"ETHRegistrarController: Not enough ether provided"
);`
6. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 196-199):
`require(
msg.value >= price.base,
"ETHController: Not enough Ether provided for renewal"
);`
7. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 232-242):
`require(
commitments[commitment] + minCommitmentAge <= block.timestamp,
"ETHRegistrarController: Commitment is not valid"
);
// If the commitment is too old, or the name is registered, stop
require(
commitments[commitment] + maxCommitmentAge > block.timestamp,
"ETHRegistrarController: Commitment has expired"
);
require(available(name), "ETHRegistrarController: Name is unavailable");`
8. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 259-262):
`require(
txNamehash == nodehash,
"ETHRegistrarController: Namehash on record do not match the name being registered"
);`
9. File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 41-47):
`require(
addr == msg.sender ||
controllers[msg.sender] ||
ens.isApprovedForAll(addr, msg.sender) ||
ownsContract(addr),
"ReverseRegistrar: Caller is not a controller or authorised by address or the address itself"
);`
10. File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 52-55):
`require(
address(resolver) != address(0),
"ReverseRegistrar: Resolver address must not be 0"
);`
11. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 60-62):
`require(
account != address(0),
"ERC1155: balance query for the zero address"
);`
12. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 85-88):
`require(
accounts.length == ids.length,
"ERC1155: accounts and ids length mismatch"
);`
13. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 176-180):
`require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: caller is not owner nor approved"
);`
14. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 195-203):
`require(
ids.length == amounts.length,
"ERC1155: ids and amounts length mismatch"
);
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: transfer caller is not owner nor approved"
);`
15. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 215-218):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
16. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 248-253):
`require(owner == address(0), "ERC1155: mint of existing token");
require(newOwner != address(0), "ERC1155: mint to the zero address");
require(
newOwner != address(this),
"ERC1155: newOwner cannot be the NameWrapper contract"
);`
17. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 290-293):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
18. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 17):
`2022-07-ens/contracts/wrapper/Controllable.sol`
[G-05] It costs more gas to initialize variables to zero than to let the default of zero be applied:-
1. File: 2022-07-ens/contracts/dnssec-oracle/DNSSECImpl.sol (line 93):
`for(uint i = 0; i < input.length; i++) {`
2. File: 2022-07-ens/contracts/dnssec-oracle/RRUtils.sol (line 310):
`for(uint i = 0; i < data.length + 31; i += 32) {`
3. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 256):
`for (uint256 i = 0; i < data.length; i++) {`
4. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 92):
`for (uint256 i = 0; i < accounts.length; ++i) {`
5. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 205):
`for (uint256 i = 0; i < ids.length; ++i) {`
function setDefaultResolver(address resolver) public override onlyOwner { require( address(resolver) != address(0), "ReverseRegistrar: Resolver address must not be 0" ); defaultResolver = NameResolver(resolver); }
function setTTL(bytes32 node, uint64 ttl)
public
override
onlyTokenOwner(node)
operationAllowed(node, CANNOT_SET_TTL)
{
ens.setTTL(node, ttl);
}`
[G-11] Don’t compare boolean expressions to boolean literals ( if (<x> == true) => if (<x>), if (<x> == false) => if (!<x>)):-
1. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 259-262):
`require(
txNamehash == nodehash,
"ETHRegistrarController: Namehash on record do not match the name being registered"
);`
2. File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 41-47):
`require(
addr == msg.sender ||
controllers[msg.sender] ||
ens.isApprovedForAll(addr, msg.sender) ||
ownsContract(addr),
"ReverseRegistrar: Caller is not a controller or authorised by address or the address itself"
);`
3. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 85-88):
`require(
accounts.length == ids.length,
"ERC1155: accounts and ids length mismatch"
);`
4. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 176-180):
`require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: caller is not owner nor approved"
);`
5. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 195-203):
`require(
ids.length == amounts.length,
"ERC1155: ids and amounts length mismatch"
);
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: transfer caller is not owner nor approved"
);`
6. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 215-218):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
7. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 248-253):
`require(owner == address(0), "ERC1155: mint of existing token");`
8. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 290-293):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
[G-12] Use custom errors rather than revert()/require() strings to save deployment gas:-
1. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 327):
`revert("ERC1155: transfer to non ERC1155Receiver implementer");`
2. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 354):
`revert("ERC1155: ERC1155Receiver rejected tokens");`
3. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 359):
`revert("ERC1155: transfer to non ERC1155Receiver implementer");`
4. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 99-102):
`require(
resolver != address(0),
"ETHRegistrarController: resolver is required when data is supplied"
);`
5. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 137-140):
`require(
msg.value >= (price.base + price.premium),
"ETHRegistrarController: Not enough ether provided"
);`
6. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 196-199):
`require(
msg.value >= price.base,
"ETHController: Not enough Ether provided for renewal"
);`
7. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 232-242):
`require(
commitments[commitment] + minCommitmentAge <= block.timestamp,
"ETHRegistrarController: Commitment is not valid"
);
// If the commitment is too old, or the name is registered, stop
require(
commitments[commitment] + maxCommitmentAge > block.timestamp,
"ETHRegistrarController: Commitment has expired"
);
require(available(name), "ETHRegistrarController: Name is unavailable");`
8. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 259-262):
`require(
txNamehash == nodehash,
"ETHRegistrarController: Namehash on record do not match the name being registered"
);`
9. File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 41-47):
`require(
addr == msg.sender ||
controllers[msg.sender] ||
ens.isApprovedForAll(addr, msg.sender) ||
ownsContract(addr),
"ReverseRegistrar: Caller is not a controller or authorised by address or the address itself"
);`
10. File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 52-55):
`require(
address(resolver) != address(0),
"ReverseRegistrar: Resolver address must not be 0"
);`
11. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 60-62):
`require(
account != address(0),
"ERC1155: balance query for the zero address"
);`
12. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 85-88):
`require(
accounts.length == ids.length,
"ERC1155: accounts and ids length mismatch"
);`
13. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 176-180):
`require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: caller is not owner nor approved"
);`
14. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 195-203):
`require(
ids.length == amounts.length,
"ERC1155: ids and amounts length mismatch"
);
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == msg.sender || isApprovedForAll(from, msg.sender),
"ERC1155: transfer caller is not owner nor approved"
);`
15. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 215-218):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
16. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 248-253):
`require(owner == address(0), "ERC1155: mint of existing token");
require(newOwner != address(0), "ERC1155: mint to the zero address");
require(
newOwner != address(this),
"ERC1155: newOwner cannot be the NameWrapper contract"
);`
17. File: 2022-07-ens/contracts/wrapper/ERC1155Fuse.sol (line 290-293):
`require(
amount == 1 && oldOwner == from,
"ERC1155: insufficient balance for transfer"
);`
18. File: 2022-07-ens/contracts/ethregistrar/ETHRegistrarController.sol (line 17):
`2022-07-ens/contracts/wrapper/Controllable.sol`
The text was updated successfully, but these errors were encountered:
[G-01] x = x + y is cheaper than x += y:-
[G-02] .length should not be looked up in every loop of a for-loop:-
[G-03] ++i costs less gas than i++, especially when it’s used in for-loops (--i/i-- too):-
[G-04] require()/revert() strings longer than 32 bytes cost extra gas:-
[G-05] It costs more gas to initialize variables to zero than to let the default of zero be applied:-
[G-06] && operator can use more gas:-
[G-07] Usage of uints/ints smaller than 32 bytes (256 bits) incurs overhead:-
[G-08] Use a more recent version of solidity:-
[G-09] Using private rather than public for constants, saves gas:-
[G-10] Functions guaranteed to revert when called by normal users can be marked
payable
:-File: 2022-07-ens/contracts/dnssec-oracle/DNSSECImpl.sol (line 58-61):
function setAlgorithm(uint8 id, Algorithm algo) public owner_only { algorithms[id] = algo; emit AlgorithmUpdated(id, address(algo)); }
File: 2022-07-ens/contracts/dnssec-oracle/DNSSECImpl.sol (line 69-72):
function setDigest(uint8 id, Digest digest) public owner_only { digests[id] = digest; emit DigestUpdated(id, address(digest)); }
File: 2022-07-ens/contracts/dnssec-oracle/Owned.sol (line 18-20):
function setOwner(address newOwner) public owner_only { owner = newOwner; }
File: 2022-07-ens/contracts/registry/ReverseRegistrar.sol (line 51-57):
function setDefaultResolver(address resolver) public override onlyOwner { require( address(resolver) != address(0), "ReverseRegistrar: Resolver address must not be 0" ); defaultResolver = NameResolver(resolver); }
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 105-110):
function setMetadataService(IMetadataService _newMetadataService) public onlyOwner { metadataService = _newMetadataService; }
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 128-131):
function setUpgradeContract(INameWrapperUpgrade _upgradeAddress) public onlyOwner {
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 335-339):
function unwrapETH2LD( bytes32 labelhash, address newRegistrant, address newController ) public override onlyTokenOwner(_makeNode(ETH_NODE, labelhash)) {
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 356-360):
function unwrap( bytes32 parentNode, bytes32 labelhash, address newController ) public override onlyTokenOwner(_makeNode(parentNode, labelhash)) {
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 373-378):
function setFuses(bytes32 node, uint32 fuses) public onlyTokenOwner(node) operationAllowed(node, CANNOT_BURN_FUSES) returns (uint32) {
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 504-515):
function setSubnodeOwner( bytes32 parentNode, string calldata label, address newOwner, uint32 fuses, uint64 expiry ) public onlyTokenOwner(parentNode) canCallSetSubnodeOwner(parentNode, keccak256(bytes(label))) returns (bytes32 node) {
File: 2022-07-ens/contracts/wrapper/NameWrapper.sol (line 584-631):
` function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
)
public
override
onlyTokenOwner(node)
operationAllowed(
node,
CANNOT_TRANSFER | CANNOT_SET_RESOLVER | CANNOT_SET_TTL
)
{
ens.setRecord(node, address(this), resolver, ttl);
(address oldOwner, , ) = getData(uint256(node));
_transfer(oldOwner, owner, uint256(node), 1, "");
}
/**
*/
function setResolver(bytes32 node, address resolver)
public
override
onlyTokenOwner(node)
operationAllowed(node, CANNOT_SET_RESOLVER)
{
ens.setResolver(node, resolver);
}
/**
*/
function setTTL(bytes32 node, uint64 ttl)
public
override
onlyTokenOwner(node)
operationAllowed(node, CANNOT_SET_TTL)
{
ens.setTTL(node, ttl);
}`
[G-11] Don’t compare boolean expressions to boolean literals (
if (<x> == true)
=>if (<x>)
,if (<x> == false)
=>if (!<x>)
):-[G-12] Use custom errors rather than revert()/require() strings to save deployment gas:-
The text was updated successfully, but these errors were encountered: