diff --git a/CHANGELOG.md b/CHANGELOG.md index d479eb28e5a..951053721e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,5 @@ # Changelog -## 3.1.1 (Unreleased) - -### Improvements - * `Address.isContract`: switched from `extcodehash` to `extcodesize` for less gas usage. ([#2311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2311)) - ## 3.1.0 (2020-06-23) ### New features diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 23a4589c6fc..e3acb9b879d 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -24,14 +24,14 @@ library Address { * ==== */ function isContract(address account) internal view returns (bool) { - // This method relies in extcodesize, which returns 0 for contracts in - // construction, since the code is only stored at the end of the - // constructor execution. - - uint256 size; + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly - assembly { size := extcodesize(account) } - return size > 0; + assembly { codehash := extcodehash(account) } + return (codehash != accountHash && codehash != 0x0); } /**