Incorrect Constructor Name

SCWE-070: Incorrect Constructor Name

Theory

Constructor is a special function, which will automatically run once during contract deployment. Each contract can have one constructor. They often perform critical, privileged actions such as setting the owner of the contract.

In Solidity versions prior to 0.4.22, constructors were defined by giving a function the same name as the contract:

contract Example {
    //Constructor function of the "Example" contract  
    //for Solidity <0.4.22 
    function Example() public {
        owner = msg.sender; 
    }
}

If the developer misspelled the function name, changed the contract name without updating the constructor, or refactored code incorrectly, the function would not be treated as a constructor. Instead, it became a public callable function.

This means:

  • The contract deploys without running the intended constructor logic.

  • Any user can later call the "constructor" function.

  • If this function sets state variables such as owner, admin, or critical configuration, an attacker can take over the contract.

Practice

Since Solidity 0.4.22, the constructor keyword solves this issue:

//Correct constructor definition for Solidity >=0.4.22
constructor() public {
    owner = msg.sender;
}

However, many legacy contracts still use the old syntax, and some modern contracts inherit from older codebases, making this vulnerability still important in audits.

A common pattern that becomes vulnerable:

contract Wallet {
    address public owner;

    function wallet() public {   // Incorrect: contract name is "Wallet"
        owner = msg.sender;      // Anyone can now call this
    }
}

Using cast, an attacker simply calls wallet() after deployment and becomes the owner.

cast call $CONTRACT_ADDRESS "wallet()" --rpc-url $RPC_URL --private-key $PK -vv 

Resources

Last updated

Was this helpful?