Skip to content

Commit 4a7a248

Browse files
committed
fix: make base generic, inherit from base
1 parent a456550 commit 4a7a248

File tree

7 files changed

+114
-107
lines changed

7 files changed

+114
-107
lines changed

src/contracts/facilitators/gsm/swapFreezer/ChainlinkOracleSwapFreezer.sol

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.10;
33

4-
import {IPoolAddressesProvider} from 'aave-v3-origin/contracts/interfaces/IPoolAddressesProvider.sol';
54
import {AutomationCompatibleInterface} from 'src/contracts/dependencies/chainlink/AutomationCompatibleInterface.sol';
5+
import {IPoolAddressesProvider} from 'aave-v3-origin/contracts/interfaces/IPoolAddressesProvider.sol';
66
import {IGsm} from 'src/contracts/facilitators/gsm/interfaces/IGsm.sol';
77
import {OracleSwapFreezerBase} from 'src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezerBase.sol';
88

@@ -18,7 +18,7 @@ contract ChainlinkOracleSwapFreezer is OracleSwapFreezerBase, AutomationCompatib
1818
* @dev All bound ranges are inclusive
1919
* @param gsm The GSM that this contract will trigger freezes/unfreezes on
2020
* @param underlyingAsset The address of the collateral asset
21-
* @param addressProvider The Aave Addresses Provider for looking up the Price Oracle
21+
* @param addressesProvider The Aave Addresses Provider for looking up the Price Oracle
2222
* @param freezeLowerBound The lower price bound for freeze operations
2323
* @param freezeUpperBound The upper price bound for freeze operations
2424
* @param unfreezeLowerBound The lower price bound for unfreeze operations, must be 0 if unfreezing not allowed
@@ -28,7 +28,7 @@ contract ChainlinkOracleSwapFreezer is OracleSwapFreezerBase, AutomationCompatib
2828
constructor(
2929
IGsm gsm,
3030
address underlyingAsset,
31-
IPoolAddressesProvider addressProvider,
31+
IPoolAddressesProvider addressesProvider,
3232
uint128 freezeLowerBound,
3333
uint128 freezeUpperBound,
3434
uint128 unfreezeLowerBound,
@@ -38,7 +38,7 @@ contract ChainlinkOracleSwapFreezer is OracleSwapFreezerBase, AutomationCompatib
3838
OracleSwapFreezerBase(
3939
gsm,
4040
underlyingAsset,
41-
addressProvider,
41+
addressesProvider,
4242
freezeLowerBound,
4343
freezeUpperBound,
4444
unfreezeLowerBound,
@@ -49,16 +49,11 @@ contract ChainlinkOracleSwapFreezer is OracleSwapFreezerBase, AutomationCompatib
4949

5050
/// @inheritdoc AutomationCompatibleInterface
5151
function performUpkeep(bytes calldata) external {
52-
Action action = _getAction();
53-
if (action == Action.FREEZE) {
54-
GSM.setSwapFreeze(true);
55-
} else if (action == Action.UNFREEZE) {
56-
GSM.setSwapFreeze(false);
57-
}
52+
_execute();
5853
}
5954

6055
/// @inheritdoc AutomationCompatibleInterface
6156
function checkUpkeep(bytes calldata) external view returns (bool, bytes memory) {
62-
return (_getAction() == Action.NONE ? false : true, '');
57+
return (_checkExecute(), '');
6358
}
6459
}
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity ^0.8.10;
33

4+
import {IGelatoOracleSwapFreezer} from 'src/contracts/facilitators/gsm/swapFreezer/interfaces/IGelatoOracleSwapFreezer.sol';
45
import {IPoolAddressesProvider} from 'aave-v3-origin/contracts/interfaces/IPoolAddressesProvider.sol';
5-
import {OracleSwapFreezerBase} from 'src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezerBase.sol';
66
import {IGsm} from 'src/contracts/facilitators/gsm/interfaces/IGsm.sol';
7+
import {OracleSwapFreezerBase} from 'src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezerBase.sol';
78

89
/**
910
* @title GelatoOracleSwapFreezer
1011
* @notice Gelato-compatible automated swap freezer for GSM.
1112
*/
12-
contract GelatoOracleSwapFreezer is OracleSwapFreezerBase {
13+
contract GelatoOracleSwapFreezer is OracleSwapFreezerBase, IGelatoOracleSwapFreezer {
1314
/**
1415
* @dev Constructor
1516
* @dev Freeze/unfreeze bounds are specified in USD with 8-decimal precision, like Aave v3 Price Oracles
1617
* @dev Unfreeze boundaries are "contained" in freeze boundaries, where freezeLowerBound < unfreezeLowerBound and unfreezeUpperBound < freezeUpperBound
1718
* @dev All bound ranges are inclusive
1819
* @param gsm The GSM that this contract will trigger freezes/unfreezes on
1920
* @param underlyingAsset The address of the collateral asset
20-
* @param addressProvider The Aave Addresses Provider for looking up the Price Oracle
21+
* @param addressesProvider The Aave Addresses Provider for looking up the Price Oracle
2122
* @param freezeLowerBound The lower price bound for freeze operations
2223
* @param freezeUpperBound The upper price bound for freeze operations
2324
* @param unfreezeLowerBound The lower price bound for unfreeze operations, must be 0 if unfreezing not allowed
@@ -27,7 +28,7 @@ contract GelatoOracleSwapFreezer is OracleSwapFreezerBase {
2728
constructor(
2829
IGsm gsm,
2930
address underlyingAsset,
30-
IPoolAddressesProvider addressProvider,
31+
IPoolAddressesProvider addressesProvider,
3132
uint128 freezeLowerBound,
3233
uint128 freezeUpperBound,
3334
uint128 unfreezeLowerBound,
@@ -37,7 +38,7 @@ contract GelatoOracleSwapFreezer is OracleSwapFreezerBase {
3738
OracleSwapFreezerBase(
3839
gsm,
3940
underlyingAsset,
40-
addressProvider,
41+
addressesProvider,
4142
freezeLowerBound,
4243
freezeUpperBound,
4344
unfreezeLowerBound,
@@ -47,24 +48,18 @@ contract GelatoOracleSwapFreezer is OracleSwapFreezerBase {
4748
{}
4849

4950
/**
50-
* @notice Executes a given action on the GSM depending on the oracle value
51+
* @dev Performs the swap freeze action depending on the oracle value
5152
*/
52-
function execute(bytes calldata) external {
53-
Action action = _getAction();
54-
if (action == Action.FREEZE) {
55-
GSM.setSwapFreeze(true);
56-
} else if (action == Action.UNFREEZE) {
57-
GSM.setSwapFreeze(false);
58-
}
53+
function performUpkeep(bytes calldata) external {
54+
_execute();
5955
}
6056

6157
/**
6258
* @notice Returns whether the action can be performed and the encoded call data for execution.
6359
* @return True if the action can be performed, false otherwise.
6460
* @return The encoded call data for the action to be executed.
6561
*/
66-
67-
function checkExecute(bytes calldata) external view returns (bool, bytes memory) {
68-
return (_getAction() == Action.NONE ? false : true, abi.encodeCall(this.execute, ''));
62+
function checkUpkeep(bytes calldata) external view returns (bool, bytes memory) {
63+
return (_getAction() == Action.NONE ? false : true, abi.encodeCall(this.performUpkeep, ('')));
6964
}
7065
}

src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezerBase.sol

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ abstract contract OracleSwapFreezerBase {
3636
* @dev All bound ranges are inclusive
3737
* @param gsm The GSM that this contract will trigger freezes/unfreezes on
3838
* @param underlyingAsset The address of the collateral asset
39-
* @param addressProvider The Aave Addresses Provider for looking up the Price Oracle
39+
* @param addressesProvider The Aave Addresses Provider for looking up the Price Oracle
4040
* @param freezeLowerBound The lower price bound for freeze operations
4141
* @param freezeUpperBound The upper price bound for freeze operations
4242
* @param unfreezeLowerBound The lower price bound for unfreeze operations, must be 0 if unfreezing not allowed
@@ -46,7 +46,7 @@ abstract contract OracleSwapFreezerBase {
4646
constructor(
4747
IGsm gsm,
4848
address underlyingAsset,
49-
IPoolAddressesProvider addressProvider,
49+
IPoolAddressesProvider addressesProvider,
5050
uint128 freezeLowerBound,
5151
uint128 freezeUpperBound,
5252
uint128 unfreezeLowerBound,
@@ -66,14 +66,34 @@ abstract contract OracleSwapFreezerBase {
6666
);
6767
GSM = gsm;
6868
UNDERLYING_ASSET = underlyingAsset;
69-
ADDRESS_PROVIDER = addressProvider;
69+
ADDRESS_PROVIDER = addressesProvider;
7070
_freezeLowerBound = freezeLowerBound;
7171
_freezeUpperBound = freezeUpperBound;
7272
_unfreezeLowerBound = unfreezeLowerBound;
7373
_unfreezeUpperBound = unfreezeUpperBound;
7474
_allowUnfreeze = allowUnfreeze;
7575
}
7676

77+
/**
78+
* @dev Performs the swap freeze action depending on the oracle value
79+
*/
80+
function _execute() internal {
81+
Action action = _getAction();
82+
if (action == Action.FREEZE) {
83+
GSM.setSwapFreeze(true);
84+
} else if (action == Action.UNFREEZE) {
85+
GSM.setSwapFreeze(false);
86+
}
87+
}
88+
89+
/**
90+
* @dev Returns whether the action can be performed
91+
* @return True if the action can be performed, false otherwise.
92+
*/
93+
function _checkExecute() internal view returns (bool) {
94+
return _getAction() == Action.NONE ? false : true;
95+
}
96+
7797
/**
7898
* @notice Returns whether or not the swap freezer can unfreeze a GSM
7999
* @return True if the freezer can unfreeze, false otherwise

tests/unit/TestChainlinkOracleSwapFreezer.t.sol

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,47 @@ contract TestChainlinkOracleSwapFreezer is TestOracleSwapFreezerBase {
77
function _deployOracleSwapFreezer(
88
IGsm gsm,
99
address underlyingAsset,
10-
IPoolAddressesProvider addressProvider,
10+
IPoolAddressesProvider addressesProvider,
1111
uint128 freezeLowerBound,
1212
uint128 freezeUpperBound,
1313
uint128 unfreezeLowerBound,
1414
uint128 unfreezeUpperBound,
1515
bool allowUnfreeze
16-
) internal override returns (OracleSwapFreezerBase) {
16+
) internal override returns (address) {
1717
return
18-
new ChainlinkOracleSwapFreezer(
19-
gsm,
20-
underlyingAsset,
21-
addressProvider,
22-
freezeLowerBound,
23-
freezeUpperBound,
24-
unfreezeLowerBound,
25-
unfreezeUpperBound,
26-
allowUnfreeze
18+
address(
19+
new ChainlinkOracleSwapFreezer(
20+
gsm,
21+
underlyingAsset,
22+
addressesProvider,
23+
freezeLowerBound,
24+
freezeUpperBound,
25+
unfreezeLowerBound,
26+
unfreezeUpperBound,
27+
allowUnfreeze
28+
)
2729
);
2830
}
2931

30-
function _checkAutomation(
31-
OracleSwapFreezerBase _swapFreezer
32-
) internal view override returns (bool) {
33-
(bool shouldRunKeeper, ) = _swapFreezer.checkUpkeep('');
32+
function _checkAutomation(address swapFreezer) internal view override returns (bool) {
33+
bytes memory returnData = Address.functionStaticCall(
34+
swapFreezer,
35+
abi.encodeWithSelector(AutomationCompatibleInterface.checkUpkeep.selector, '')
36+
);
37+
(bool shouldRunKeeper, ) = abi.decode(returnData, (bool, bytes));
3438
return shouldRunKeeper;
3539
}
3640

37-
function _checkAndPerformAutomation(
38-
OracleSwapFreezerBase _swapFreezer
39-
) internal override returns (bool) {
40-
(bool shouldRunKeeper, bytes memory performData) = _swapFreezer.checkUpkeep('');
41+
function _checkAndPerformAutomation(address swapFreezer) internal override returns (bool) {
42+
bytes memory returnData = Address.functionStaticCall(
43+
swapFreezer,
44+
abi.encodeWithSelector(AutomationCompatibleInterface.checkUpkeep.selector, '')
45+
);
46+
(bool shouldRunKeeper, bytes memory performData) = abi.decode(returnData, (bool, bytes));
47+
4148
if (shouldRunKeeper) {
42-
_swapFreezer.performUpkeep(performData);
49+
AutomationCompatibleInterface(swapFreezer).performUpkeep(performData);
4350
}
4451
return shouldRunKeeper;
4552
}
46-
47-
function _performAutomation(
48-
OracleSwapFreezerBase _swapFreezer,
49-
bytes memory performData
50-
) internal override {
51-
_swapFreezer.performUpkeep(performData);
52-
}
5353
}

tests/unit/TestGelatoOracleSwapFreezer.t.sol

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,57 @@
22
pragma solidity ^0.8.0;
33

44
import './TestOracleSwapFreezerBase.t.sol';
5-
import {Address} from 'openzeppelin-contracts/contracts/utils/Address.sol';
65

7-
contract TestGsmGelatoOracleSwapFreezer is TestOracleSwapFreezerBase {
6+
contract TestGelatoOracleSwapFreezer is TestOracleSwapFreezerBase {
87
using Address for address;
98

109
function testCheckUpkeepReturnsCorrectSelector() public view {
11-
(, bytes memory data) = swapFreezer.checkExecute('');
10+
(, bytes memory data) = IGelatoOracleSwapFreezer(swapFreezer).checkUpkeep('');
1211
bytes4 selector;
1312
assembly {
1413
selector := mload(add(data, 32))
1514
}
16-
assertEq(selector, OracleSwapFreezerBase.performUpkeep.selector);
15+
assertEq(selector, IGelatoOracleSwapFreezer.performUpkeep.selector);
1716
}
1817

1918
function _deployOracleSwapFreezer(
2019
IGsm gsm,
2120
address underlyingAsset,
22-
IPoolAddressesProvider addressProvider,
21+
IPoolAddressesProvider addressesProvider,
2322
uint128 freezeLowerBound,
2423
uint128 freezeUpperBound,
2524
uint128 unfreezeLowerBound,
2625
uint128 unfreezeUpperBound,
2726
bool allowUnfreeze
28-
) internal override returns (OracleSwapFreezerBase) {
27+
) internal override returns (address) {
2928
return
30-
new GelatoOracleSwapFreezer(
31-
gsm,
32-
underlyingAsset,
33-
addressProvider,
34-
freezeLowerBound,
35-
freezeUpperBound,
36-
unfreezeLowerBound,
37-
unfreezeUpperBound,
38-
allowUnfreeze
29+
address(
30+
new GelatoOracleSwapFreezer(
31+
gsm,
32+
underlyingAsset,
33+
addressesProvider,
34+
freezeLowerBound,
35+
freezeUpperBound,
36+
unfreezeLowerBound,
37+
unfreezeUpperBound,
38+
allowUnfreeze
39+
)
3940
);
4041
}
4142

42-
function _checkAutomation(
43-
OracleSwapFreezerBase _swapFreezer
44-
) internal view override returns (bool) {
45-
(bool shouldRunKeeper, ) = _swapFreezer.checkExecute('');
43+
function _checkAutomation(address swapFreezer) internal view override returns (bool) {
44+
(bool shouldRunKeeper, ) = IGelatoOracleSwapFreezer(swapFreezer).checkUpkeep('');
4645
return shouldRunKeeper;
4746
}
4847

4948
function _checkAndPerformAutomation(
50-
OracleSwapFreezerBase _swapFreezer
49+
address swapFreezer
5150
) internal virtual override returns (bool) {
52-
(bool shouldRunKeeper, bytes memory encodedPerformData) = _swapFreezer.checkExecute('');
51+
(bool shouldRunKeeper, bytes memory encodedPerformCall) = IGelatoOracleSwapFreezer(swapFreezer)
52+
.checkUpkeep('');
5353
if (shouldRunKeeper) {
54-
address(_swapFreezer).functionCall(encodedPerformData);
54+
swapFreezer.functionCall(encodedPerformCall);
5555
}
5656
return shouldRunKeeper;
5757
}
58-
59-
function _performAutomation(
60-
OracleSwapFreezerBase _swapFreezer,
61-
bytes memory encodedCalldata
62-
) internal override {
63-
address(_swapFreezer).functionCall(encodedCalldata);
64-
}
6558
}

tests/unit/TestGhoBase.t.sol

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import 'forge-std/Test.sol';
55
import 'forge-std/console2.sol';
66
import {Vm} from 'forge-std/Vm.sol';
77

8+
// dependencies
9+
import {Address} from 'openzeppelin-contracts/contracts/utils/Address.sol';
10+
import {AutomationCompatibleInterface} from 'src/contracts/dependencies/chainlink/AutomationCompatibleInterface.sol';
11+
812
// helpers
913
import {Constants} from '../helpers/Constants.sol';
1014
import {DebtUtils} from '../helpers/DebtUtils.sol';
@@ -83,8 +87,10 @@ import {GhoGsmSteward} from 'src/contracts/misc/GhoGsmSteward.sol';
8387
import {FixedFeeStrategyFactory} from 'src/contracts/facilitators/gsm/feeStrategy/FixedFeeStrategyFactory.sol';
8488
import {GhoReserve} from 'src/contracts/facilitators/gsm/GhoReserve.sol';
8589
import {OwnableFacilitator} from 'src/contracts/facilitators/gsm/OwnableFacilitator.sol';
90+
import {OracleSwapFreezerBase} from 'src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezerBase.sol';
8691
import {ChainlinkOracleSwapFreezer} from 'src/contracts/facilitators/gsm/swapFreezer/ChainlinkOracleSwapFreezer.sol';
8792
import {GelatoOracleSwapFreezer} from 'src/contracts/facilitators/gsm/swapFreezer/GelatoOracleSwapFreezer.sol';
93+
import {IGelatoOracleSwapFreezer} from 'src/contracts/facilitators/gsm/swapFreezer/interfaces/IGelatoOracleSwapFreezer.sol';
8894

8995
// CCIP contracts
9096
import {MockUpgradeableLockReleaseTokenPool} from '../mocks/MockUpgradeableLockReleaseTokenPool.sol';

0 commit comments

Comments
 (0)