When variables are declared nearby (sometimes either in other abstract contract, but close on declaration order), using the setVariable method on one, can erase the information about the other variable.
contract Bug {
address public myAddress;
bool public myBool;
}
Given that myAddress (that occupies ~uint160) and myBool are stored together, the second setVariable method aims to the entire data slot and overwrites it with 0x0000...1 (true), and when the myAddress slot is fetched, is filled with 0s.
An example contract is added, and a test replicating the descripted bug.
Bug description:
When variables are declared nearby (sometimes either in other abstract contract, but close on declaration order), using the
setVariable
method on one, can erase the information about the other variable.Given that
myAddress
(that occupies ~uint160
) andmyBool
are stored together, the secondsetVariable
method aims to the entire data slot and overwrites it with0x0000...1
(true
), and when themyAddress
slot is fetched, is filled with0
s.An example contract is added, and a test replicating the descripted bug.