我编写了一个事务保护智能合同什么是事务保护?,它是可升级的(UUPS方法openzappelin 什么是可升级的合同?)。因此,当我们部署这个事务保护智能契约时,它基本上给出了一个代理地址。当我使用Genosis的setGuard方法将其设置为checkTransaction时,我在事务保护交易保护合同实例的checkTransaction函数中给出的限制似乎根本不起作用。是否就像代理合同不能在Genosis中充当交易守卫一样?当我将保护设置为事务保护智能契约(没有UUPS可升级功能)时,它的工作方式是正确的。
发布于 2023-02-23 13:02:32
我相信这个功能可以以一种更好的方式实现:
而不是这样:
interface ISafe {
function getOwners() external view returns (address[] memory);
}
/**
* @notice Called by the Safe contract before a transaction is executed.
* @dev Reverts if the transaction is not executed by an owner.
* @param msgSender Executor of the transaction.
*/
function checkTransaction(
address,
uint256,
bytes memory,
Enum.Operation,
uint256,
uint256,
uint256,
address,
// solhint-disable-next-line no-unused-vars
address payable,
bytes memory,
address msgSender
) external view override {
// Only owners can exec
address[] memory owners = ISafe(msg.sender).getOwners();
for (uint256 i = 0; i < owners.length; i++) {
if (owners[i] == msgSender) {
return;
}
}
// msg sender is not an owner
revert("msg sender is not allowed to exec");
}你可以用这个:
interface ISafe {
function isOwner(address owner) external view returns (bool)
}
/**
* @notice Called by the Safe contract before a transaction is executed.
* @dev Reverts if the transaction is not executed by an owner.
* @param msgSender Executor of the transaction.
*/
function checkTransaction(
address,
uint256,
bytes memory,
Enum.Operation,
uint256,
uint256,
uint256,
address,
// solhint-disable-next-line no-unused-vars
address payable,
bytes memory,
address msgSender
) external view override {
// Only owners can exec
require(ISafe(msg.sender).isOwner(msgSender), "msg sender is not allowed to exec");
}没有时间对此进行详细的测试或思考,但这似乎是一种合理的逻辑。
https://ethereum.stackexchange.com/questions/145458
复制相似问题