diff --git a/contracts/guard/src/GuardV0.sol b/contracts/guard/src/GuardV0.sol index 6417b4a2..44c38746 100644 --- a/contracts/guard/src/GuardV0.sol +++ b/contracts/guard/src/GuardV0.sol @@ -8,6 +8,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/access/Ownable.sol"; import "./lib/Path.sol"; import "./IGuard.sol"; +import "./GuardV0Base.sol"; /** * Prototype guard implementation. @@ -15,8 +16,24 @@ import "./IGuard.sol"; * - Hardcoded actions for Uniswap v2, v3, 1delta * */ -contract GuardV0 is IGuard, GuardV0Base, Ownable { +contract GuardV0 is GuardV0Base, Ownable { constructor() Ownable() { } + + /** + * Specify a modifier for guard owner + */ + modifier onlyGuardOwner() override { + require(owner() == _msgSender(), "Ownable: caller is not the owner"); + _; + } + + /** + * Get the address of the proto DAO + */ + function getGovernanceAddress() override public view returns (address) { + return owner(); + } + } \ No newline at end of file diff --git a/contracts/guard/src/GuardV0Base.sol b/contracts/guard/src/GuardV0Base.sol index 44271ee4..559b8ed9 100644 --- a/contracts/guard/src/GuardV0Base.sol +++ b/contracts/guard/src/GuardV0Base.sol @@ -11,10 +11,12 @@ import "./IGuard.sol"; /** * Prototype guard implementation. * - * - Hardcoded actions for Uniswap v2, v3, 1delta + * - Hardcoded actions for Uniswap v2, v3, 1delta, Aave + * + * - Abstract base contract to deal with different ownership modifiers and initialisers (Safe, OpenZeppelin) * */ -abstract contract GuardV0Base { +abstract contract GuardV0Base is IGuard { using Path for bytes; using BytesLib for bytes; @@ -247,10 +249,19 @@ abstract contract GuardV0Base { allowAsset(token, notes); } + // Satisfy IGuard function validateCall( address sender, address target, bytes calldata callDataWithSelector + ) external view { + _validateCallInternal(sender, target, callDataWithSelector); + } + + function _validateCallInternal( + address sender, + address target, + bytes calldata callDataWithSelector ) public view { if(sender == getGovernanceAddress()) { diff --git a/contracts/guard/src/IGuard.sol b/contracts/guard/src/IGuard.sol index fbbe5f68..08ec37e8 100644 --- a/contracts/guard/src/IGuard.sol +++ b/contracts/guard/src/IGuard.sol @@ -1,5 +1,9 @@ pragma solidity ^0.8.0; interface IGuard { - function validateCall(address sender, address target, bytes memory callDataWithSelector) external; + + /** + * Revert if the smart contract call is not allowed + */ + function validateCall(address sender, address target, bytes memory callDataWithSelector) external view; } \ No newline at end of file diff --git a/contracts/guard/src/MockGuard.sol b/contracts/guard/src/MockGuard.sol index f7d4c764..b5cf9801 100644 --- a/contracts/guard/src/MockGuard.sol +++ b/contracts/guard/src/MockGuard.sol @@ -15,7 +15,7 @@ contract MockGuard is IGuard { address sender, address target, bytes calldata callDataWithSelector - ) external view { + ) public view { // Don't revert } diff --git a/contracts/safe-integration/src/TradingStrategyModule.sol b/contracts/safe-integration/src/TradingStrategyModule.sol index e3bd1a3a..c2a0ded9 100644 --- a/contracts/safe-integration/src/TradingStrategyModule.sol +++ b/contracts/safe-integration/src/TradingStrategyModule.sol @@ -66,7 +66,7 @@ contract TradingStrategyModule is Module, GuardV0Base { // Check that the asset manager can perform this function. // Will revert() on error - validateCall(msg.sender, target, callData); + _validateCallInternal(msg.sender, target, callData); // Inherit from Module contract, // execute a tx on behalf of Gnosis