Допустим, мой контракт взаимодействует с другим контрактом.
Контракт, с которым я взаимодействую, имеет, например, требование, которое вернется, если у вас недостаточно токенов.
Теперь я не уверен, должен ли я добавить такое же требование к моему контракту. Было бы уязвимо, если бы я полагался только на оператор require из другого контракта?
Спасибо
Это зависит от того, как вы вызываете внешний контракт.
Если вы используете объект типа контракта/интерфейса и именованную функцию (см. getExternalValueNamed()
), она отменяет основную транзакцию.
Но если вы используете низкоуровневый вызов (см. getExternalValueCall()
), он не отменяет основную транзакцию.
pragma solidity ^0.8;
contract ExternalContract {
function getValue() public {
revert();
}
}
contract Caller {
address externalContractAddress;
constructor(address _externalContractAddress) {
externalContractAddress = _externalContractAddress;
}
function getExternalValueNamed() public {
// causes the main transaction to revert
ExternalContract(externalContractAddress).getValue();
}
function getExternalValueCall() public {
// does not revert the main transaction
externalContractAddress.call(
abi.encodeWithSignature("getValue()")
);
}
}
Большой! Большое спасибо.