View Source: openzeppelin-solidity/contracts/utils/Address.sol
Address
Collection of functions related to the address type
- isContract(address account)
- sendValue(address payable recipient, uint256 amount)
- functionCall(address target, bytes data)
- functionCall(address target, bytes data, string errorMessage)
- functionCallWithValue(address target, bytes data, uint256 value)
- functionCallWithValue(address target, bytes data, uint256 value, string errorMessage)
- functionStaticCall(address target, bytes data)
- functionStaticCall(address target, bytes data, string errorMessage)
- functionDelegateCall(address target, bytes data)
- functionDelegateCall(address target, bytes data, string errorMessage)
- verifyCallResult(bool success, bytes returndata, string errorMessage)
It is unsafe to assume that an address for which this function returns
false is an externally-owned account (EOA) and not a contract.
Among others, isContract
will return false for the following
types of addresses:
- an externally-owned account
- a contract in construction
- an address where a contract will be created
- an address where a contract lived, but was destroyed ====
function isContract(address account) internal view
returns(bool)
Arguments
Name | Type | Description |
---|---|---|
account | address |
Source Code
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
Replacement for Solidity's transfer
: sends amount
wei to
recipient
, forwarding all available gas and reverting on errors.
https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
of certain opcodes, possibly making contracts go over the 2300 gas limit
imposed by transfer
, making them unable to receive funds via
transfer
. {sendValue} removes this limitation.
https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
IMPORTANT: because control is transferred to recipient
, care must be
taken to not create reentrancy vulnerabilities. Consider using
{ReentrancyGuard} or the
https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
function sendValue(address payable recipient, uint256 amount) internal nonpayable
Arguments
Name | Type | Description |
---|---|---|
recipient | address payable | |
amount | uint256 |
Source Code
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
Performs a Solidity function call using a low level call
. A
plain call
is an unsafe replacement for a function call: use this
function instead.
If target
reverts with a revert reason, it is bubbled up by this
function (like regular Solidity function calls).
Returns the raw returned data. To convert to the expected return value,
use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
Requirements:
target
must be a contract.- calling
target
withdata
must not revert. Available since v3.1.
function functionCall(address target, bytes data) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes |
Source Code
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
Same as {xref-Address-functionCall-address-bytes-}[functionCall
], but with
errorMessage
as a fallback revert reason when target
reverts.
Available since v3.1.
function functionCall(address target, bytes data, string errorMessage) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes | |
errorMessage | string |
Source Code
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
Same as {xref-Address-functionCall-address-bytes-}[functionCall
],
but also transferring value
wei to target
.
Requirements:
- the calling contract must have an ETH balance of at least
value
. - the called Solidity function must be
payable
. Available since v3.1.
function functionCallWithValue(address target, bytes data, uint256 value) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes | |
value | uint256 |
Source Code
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[functionCallWithValue
], but
with errorMessage
as a fallback revert reason when target
reverts.
Available since v3.1.
function functionCallWithValue(address target, bytes data, uint256 value, string errorMessage) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes | |
value | uint256 | |
errorMessage | string |
Source Code
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
Same as {xref-Address-functionCall-address-bytes-}[functionCall
],
but performing a static call.
Available since v3.3.
function functionStaticCall(address target, bytes data) internal view
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes |
Source Code
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
Same as {xref-Address-functionCall-address-bytes-string-}[functionCall
],
but performing a static call.
Available since v3.3.
function functionStaticCall(address target, bytes data, string errorMessage) internal view
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes | |
errorMessage | string |
Source Code
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
Same as {xref-Address-functionCall-address-bytes-}[functionCall
],
but performing a delegate call.
Available since v3.4.
function functionDelegateCall(address target, bytes data) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes |
Source Code
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
Same as {xref-Address-functionCall-address-bytes-string-}[functionCall
],
but performing a delegate call.
Available since v3.4.
function functionDelegateCall(address target, bytes data, string errorMessage) internal nonpayable
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
target | address | |
data | bytes | |
errorMessage | string |
Source Code
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the revert reason using the provided one. Available since v4.3.
function verifyCallResult(bool success, bytes returndata, string errorMessage) internal pure
returns(bytes)
Arguments
Name | Type | Description |
---|---|---|
success | bool | |
returndata | bytes | |
errorMessage | string |
Source Code
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
- AaveStrategy
- AccessControl
- AccessControlLibV1
- Address
- BaseLibV1
- BokkyPooBahsDateTimeLibrary
- BondPool
- BondPoolBase
- BondPoolLibV1
- CompoundStrategy
- Context
- Cover
- CoverBase
- CoverLibV1
- CoverReassurance
- CoverStake
- CoverUtilV1
- cxToken
- cxTokenFactory
- cxTokenFactoryLibV1
- Delayable
- Destroyable
- ERC165
- ERC20
- FakeAaveLendingPool
- FakeCompoundDaiDelegator
- FakePriceOracle
- FakeRecoverable
- FakeStore
- FakeToken
- FakeUniswapPair
- FakeUniswapV2FactoryLike
- FakeUniswapV2PairLike
- FakeUniswapV2RouterLike
- FaultyAaveLendingPool
- FaultyCompoundDaiDelegator
- Finalization
- ForceEther
- Governance
- GovernanceUtilV1
- IAaveV2LendingPoolLike
- IAccessControl
- IBondPool
- IClaimsProcessor
- ICompoundERC20DelegatorLike
- ICover
- ICoverReassurance
- ICoverStake
- ICxToken
- ICxTokenFactory
- IERC165
- IERC20
- IERC20Detailed
- IERC20Metadata
- IERC3156FlashBorrower
- IERC3156FlashLender
- IFinalization
- IGovernance
- ILendingStrategy
- ILiquidityEngine
- IMember
- INeptuneRouterV1
- InvalidStrategy
- IPausable
- IPolicy
- IPolicyAdmin
- IPriceOracle
- IProtocol
- IRecoverable
- IReporter
- IResolution
- IResolvable
- IStakingPools
- IStore
- IStoreLike
- IUniswapV2FactoryLike
- IUniswapV2PairLike
- IUniswapV2RouterLike
- IUnstakable
- IVault
- IVaultDelegate
- IVaultFactory
- IWitness
- LiquidityEngine
- MaliciousToken
- MockAccessControlUser
- MockCoverUtilUser
- MockCxToken
- MockCxTokenPolicy
- MockCxTokenStore
- MockFlashBorrower
- MockLiquidityEngineUser
- MockProcessorStore
- MockProcessorStoreLib
- MockProtocol
- MockRegistryClient
- MockStore
- MockStoreKeyUtilUser
- MockValidationLibUser
- MockVault
- MockVaultLibUser
- NeptuneRouterV1
- NPM
- NpmDistributor
- NTransferUtilV2
- NTransferUtilV2Intermediate
- Ownable
- Pausable
- Policy
- PolicyAdmin
- PolicyHelperV1
- PoorMansERC20
- POT
- PriceLibV1
- Processor
- ProtoBase
- Protocol
- ProtoUtilV1
- Recoverable
- ReentrancyGuard
- RegistryLibV1
- Reporter
- Resolution
- Resolvable
- RoutineInvokerLibV1
- SafeERC20
- StakingPoolBase
- StakingPoolCoreLibV1
- StakingPoolInfo
- StakingPoolLibV1
- StakingPoolReward
- StakingPools
- Store
- StoreBase
- StoreKeyUtil
- StrategyLibV1
- Strings
- TimelockController
- Unstakable
- ValidationLibV1
- Vault
- VaultBase
- VaultDelegate
- VaultDelegateBase
- VaultDelegateWithFlashLoan
- VaultFactory
- VaultFactoryLibV1
- VaultLibV1
- VaultLiquidity
- VaultStrategy
- WithFlashLoan
- WithPausability
- WithRecovery
- Witness