Skip to content

Commit

Permalink
feat: move tokensIn check to facade (#43)
Browse files Browse the repository at this point in the history
* feat: move tokensIn check to facade

* fix: breaking test

* feat: update logic

* fix: update name
  • Loading branch information
r0ohafza committed Oct 18, 2022
1 parent 08d5fd3 commit 7078ee7
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 70 deletions.
9 changes: 1 addition & 8 deletions src/aave/AaveV2Controller.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity ^0.8.17;

import {IController} from "../core/IController.sol";
import {IControllerFacade} from "../core/IControllerFacade.sol";
import {IProtocolDataProvider} from "./IProtocolDataProvider.sol";

/**
Expand Down Expand Up @@ -32,24 +31,18 @@ contract AaveV2Controller is IController {
*/
IProtocolDataProvider public immutable dataProvider;

/// @notice IControllerFacade
IControllerFacade public immutable controllerFacade;

/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */

/**
@notice Contract constructor
@param _controller address of controller Facade
@param _dataProvider address of aave v2 data provider
*/
constructor(
IControllerFacade _controller,
IProtocolDataProvider _dataProvider
)
{
controllerFacade = _controller;
dataProvider = _dataProvider;
}

Expand All @@ -74,7 +67,7 @@ contract AaveV2Controller is IController {
(tokensIn[0],,) = dataProvider.getReserveTokensAddresses(asset);
tokensOut[0] = asset;
return (
controllerFacade.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
tokensOut
);
Expand Down
22 changes: 1 addition & 21 deletions src/aave/AaveV3Controller.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity ^0.8.17;

import {IController} from "../core/IController.sol";
import {IControllerFacade} from "../core/IControllerFacade.sol";
import {IPoolV3} from "./IPoolV3.sol";

/**
Expand All @@ -22,25 +21,6 @@ contract AaveV3Controller is IController {
/// @notice withdraw(address,uint256,address) function signature
bytes4 public constant WITHDRAW = 0x69328dec;

/* -------------------------------------------------------------------------- */
/* STATE VARIABLES */
/* -------------------------------------------------------------------------- */

/// @notice IControllerFacade
IControllerFacade public immutable controllerFacade;

/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */

/**
@notice Contract Constructor
@param _controller Address of controller facade
*/
constructor(IControllerFacade _controller) {
controllerFacade = _controller;
}

/* -------------------------------------------------------------------------- */
/* PUBLIC FUNCTIONS */
/* -------------------------------------------------------------------------- */
Expand All @@ -62,7 +42,7 @@ contract AaveV3Controller is IController {
tokensIn[0] = IPoolV3(target).getReserveData(asset).aTokenAddress;
tokensOut[0] = asset;
return (
controllerFacade.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
tokensOut
);
Expand Down
29 changes: 5 additions & 24 deletions src/balancer/BalancerController.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity ^0.8.17;

import {IController} from "../core/IController.sol";
import {IControllerFacade} from "../core/IControllerFacade.sol";
import {IVault} from "./IVault.sol";

/**
Expand All @@ -24,24 +23,6 @@ contract BalancerController is IController {
/// @notice swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)
bytes4 constant SWAP = 0x52bbbe29;

/* -------------------------------------------------------------------------- */
/* STATE_VARIABLES */
/* -------------------------------------------------------------------------- */

IControllerFacade immutable controllerFacade;

/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */

/**
@notice Contract constructor
@param _controller Controller Facade
*/
constructor(IControllerFacade _controller) {
controllerFacade = _controller;
}

/* -------------------------------------------------------------------------- */
/* EXTERNAL FUNCTIONS */
/* -------------------------------------------------------------------------- */
Expand Down Expand Up @@ -98,7 +79,7 @@ contract BalancerController is IController {
(tokensIn[0],) = IVault(target).getPool(poolId);

return (
controllerFacade.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
tokensOut
);
Expand Down Expand Up @@ -132,15 +113,15 @@ contract BalancerController is IController {
(tokensOut[0],) = IVault(target).getPool(poolId);

return (
controllerFacade.isTokenAllowed(tokensOut[0]),
true,
tokensIn,
tokensOut
);
}

function canSwap(address, bool, bytes calldata data)
internal
view
pure
returns (bool, address[] memory, address[] memory)
{
(
Expand All @@ -159,7 +140,7 @@ contract BalancerController is IController {
tokensIn = new address[](1);
tokensIn[0] = address(swap.assetOut);
return (
controllerFacade.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
new address[](0)
);
Expand All @@ -181,7 +162,7 @@ contract BalancerController is IController {
tokensIn[0] = address(swap.assetOut);

return (
controllerFacade.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
tokensOut
);
Expand Down
24 changes: 22 additions & 2 deletions src/core/ControllerFacade.sol
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,30 @@ contract ControllerFacade is Ownable, IControllerFacade {
address target,
bool useEth,
bytes calldata data
) external view returns (bool, address[] memory, address[] memory) {
return controllerFor[target].canCall(target, useEth, data);
)
external
view
returns (bool isValid, address[] memory tokensIn, address[] memory tokensOut)
{
(isValid, tokensIn, tokensOut) = controllerFor[target].canCall(target, useEth, data);
if (isValid) isValid = validateTokensIn(tokensIn);
}

/* -------------------------------------------------------------------------- */
/* INTERNAL FUNCTIONS */
/* -------------------------------------------------------------------------- */

function validateTokensIn(address[] memory tokensIn)
internal
view
returns (bool)
{
for (uint i; i < tokensIn.length; i++)
if (!isTokenAllowed[tokensIn[i]]) return false;
return true;
}


/* -------------------------------------------------------------------------- */
/* ADMIN FUNCTIONS */
/* -------------------------------------------------------------------------- */
Expand Down
3 changes: 2 additions & 1 deletion src/tests/Balancer.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ contract TestBalancer is TestBase {

function setUp() public {
setupControllerFacade();
balancerController = new BalancerController(controllerFacade);
balancerController = new BalancerController();
controllerFacade.updateController(vault, balancerController);
}

Expand Down Expand Up @@ -106,6 +106,7 @@ contract TestBalancer is TestBase {
function testCanExit() public {
// Setup
controllerFacade.toggleTokenAllowance(0xCfCA23cA9CA720B6E98E3Eb9B6aa0fFC4a5C08B9);
controllerFacade.toggleTokenAllowance(0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF);
bytes32 poolId = 0xcfca23ca9ca720b6e98e3eb9b6aa0ffc4a5c08b9000200000000000000000274;
address sender = 0xABBb9Eb2512904123f9d372f26e2390a190d8550;
address receiver = 0xABBb9Eb2512904123f9d372f26e2390a190d8550;
Expand Down
21 changes: 7 additions & 14 deletions src/uniswap/UniV2Controller.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity ^0.8.17;

import {IController} from "../core/IController.sol";
import {IControllerFacade} from "../core/IControllerFacade.sol";
import {IUniV2Factory} from "./IUniV2Factory.sol";

/**
Expand Down Expand Up @@ -56,9 +55,6 @@ contract UniV2Controller is IController {
/// @notice Uniswap v2 factory
IUniV2Factory public immutable UNIV2_FACTORY;

/// @notice IControllerFacade
IControllerFacade public immutable controller;

/* -------------------------------------------------------------------------- */
/* CONSTRUCTOR */
/* -------------------------------------------------------------------------- */
Expand All @@ -67,16 +63,13 @@ contract UniV2Controller is IController {
@notice Contract constructor
@param _WETH WETH address
@param _uniV2Factory Uniswap V2 Factory address
@param _controller Controller Facade
*/
constructor(
address _WETH,
IUniV2Factory _uniV2Factory,
IControllerFacade _controller
IUniV2Factory _uniV2Factory
) {
WETH = _WETH;
UNIV2_FACTORY = _uniV2Factory;
controller = _controller;
}

/* -------------------------------------------------------------------------- */
Expand Down Expand Up @@ -135,7 +128,7 @@ contract UniV2Controller is IController {
address[] memory tokensIn = new address[](1);
tokensIn[0] = UNIV2_FACTORY.getPair(tokenA, tokenB);

return(controller.isTokenAllowed(tokensIn[0]), tokensIn, tokensOut);
return(true, tokensIn, tokensOut);
}

/**
Expand All @@ -160,7 +153,7 @@ contract UniV2Controller is IController {
address[] memory tokensIn = new address[](1);
tokensIn[0] = UNIV2_FACTORY.getPair(token, WETH);

return(controller.isTokenAllowed(tokensIn[0]), tokensIn, tokensOut);
return(true, tokensIn, tokensOut);
}

/**
Expand Down Expand Up @@ -225,7 +218,7 @@ contract UniV2Controller is IController {
*/
function swapErc20ForErc20(bytes calldata data)
internal
view
pure
returns (bool, address[] memory, address[] memory)
{
(,, address[] memory path,,)
Expand All @@ -238,7 +231,7 @@ contract UniV2Controller is IController {
tokensIn[0] = path[path.length - 1];

return(
controller.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
tokensOut
);
Expand All @@ -255,7 +248,7 @@ contract UniV2Controller is IController {
*/
function swapEthForErc20(bytes calldata data)
internal
view
pure
returns (bool, address[] memory, address[] memory)
{
(, address[] memory path,,)
Expand All @@ -265,7 +258,7 @@ contract UniV2Controller is IController {
tokensIn[0] = path[path.length - 1];

return (
controller.isTokenAllowed(tokensIn[0]),
true,
tokensIn,
new address[](0)
);
Expand Down

0 comments on commit 7078ee7

Please sign in to comment.