2023-01-29 18:29:54 +00:00
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
pragma solidity ^0.8.17;
|
2022-02-11 04:17:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Utility library of inline functions on addresses
|
|
|
|
*/
|
|
|
|
library Address {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns whether the target address is a contract
|
|
|
|
* @dev This function will return false if invoked during the constructor of a contract,
|
|
|
|
* as the code is not actually created until after the constructor finishes.
|
|
|
|
* @param account address of the account to check
|
|
|
|
* @return whether the target address is a contract
|
|
|
|
*/
|
|
|
|
function isContract(address account) internal view returns (bool) {
|
|
|
|
uint256 size;
|
|
|
|
// XXX Currently there is no better way to check if there is a contract in an address
|
|
|
|
// than to check the size of the code at that address.
|
|
|
|
// See https://ethereum.stackexchange.com/a/14016/36603
|
|
|
|
// for more details about how this works.
|
|
|
|
// TODO Check this again before the Serenity release, because all addresses will be
|
|
|
|
// contracts then.
|
|
|
|
// solium-disable-next-line security/no-inline-assembly
|
|
|
|
assembly { size := extcodesize(account) }
|
|
|
|
return size > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|