Skip to content

Commit ecbe493

Browse files
chore: rate injector deploy scripts (#61)
* chore: rate injector deploy script * feat: add gelato wrappers * chore: update config * chore: update salt
1 parent f685004 commit ecbe493

12 files changed

+435
-20
lines changed

scripts/deploy/DeployDiscountRateInjector.s.sol

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {GovernanceV3Plasma} from 'aave-address-book/GovernanceV3Plasma.sol';
1010
import {ICreate3Factory} from 'solidity-utils/contracts/create3/interfaces/ICreate3Factory.sol';
1111
import {EdgeRiskStewardDiscountRate, IRiskSteward} from '../../src/contracts/EdgeRiskStewardDiscountRate.sol';
1212
import {AaveStewardInjectorDiscountRate} from '../../src/contracts/AaveStewardInjectorDiscountRate.sol';
13+
import {GelatoAaveStewardInjectorDiscountRate} from '../../src/contracts/gelato/GelatoAaveStewardInjectorDiscountRate.sol';
1314

1415
library DeployStewardContracts {
1516
struct DeployStewardInput {
@@ -28,6 +29,7 @@ library DeployStewardContracts {
2829
address owner;
2930
address guardian;
3031
address[] whitelistedMarkets;
32+
bool isGelatoInjector;
3133
}
3234

3335
function _deployRiskStewards(
@@ -42,10 +44,13 @@ library DeployStewardContracts {
4244
function _deployDiscountRateStewardInjector(
4345
DeployInjectorInput memory input
4446
) internal returns (address) {
47+
bytes memory injectorCode = input.isGelatoInjector ?
48+
type(GelatoAaveStewardInjectorDiscountRate).creationCode : type(AaveStewardInjectorDiscountRate).creationCode;
49+
4550
address stewardInjector = ICreate3Factory(input.create3Factory).create(
4651
input.salt,
4752
abi.encodePacked(
48-
type(AaveStewardInjectorDiscountRate).creationCode,
53+
injectorCode,
4954
abi.encode(input.aaveOracle, input.edgeRiskOracle, input.riskSteward, input.whitelistedMarkets, input.owner, input.guardian)
5055
)
5156
);
@@ -97,7 +102,8 @@ contract DeployEthereum is EthereumScript {
97102
edgeRiskOracle: EDGE_RISK_ORACLE,
98103
owner: GovernanceV3Ethereum.EXECUTOR_LVL_1,
99104
guardian: GUARDIAN,
100-
whitelistedMarkets: whitelistedPendleAssets
105+
whitelistedMarkets: whitelistedPendleAssets,
106+
isGelatoInjector: false
101107
})
102108
);
103109
vm.stopBroadcast();
@@ -112,7 +118,7 @@ contract DeployPlasma is PlasmaScript {
112118

113119
function run() external {
114120
vm.startBroadcast();
115-
bytes32 salt = 'DiscountRateStewardInjector';
121+
bytes32 salt = 'DiscountRateStewardInjectorV2';
116122
address predictedStewardsInjector = ICreate3Factory(CREATE_3_FACTORY)
117123
.predictAddress(msg.sender, salt);
118124

@@ -134,7 +140,8 @@ contract DeployPlasma is PlasmaScript {
134140
edgeRiskOracle: EDGE_RISK_ORACLE,
135141
owner: GovernanceV3Plasma.EXECUTOR_LVL_1,
136142
guardian: GUARDIAN,
137-
whitelistedMarkets: new address[](0)
143+
whitelistedMarkets: new address[](0),
144+
isGelatoInjector: true
138145
})
139146
);
140147
vm.stopBroadcast();

scripts/deploy/DeployEModeInjector.s.sol

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {GovernanceV3Plasma} from 'aave-address-book/GovernanceV3Plasma.sol';
1111
import {ICreate3Factory} from 'solidity-utils/contracts/create3/interfaces/ICreate3Factory.sol';
1212
import {EdgeRiskStewardEMode, IRiskSteward} from '../../src/contracts/EdgeRiskStewardEMode.sol';
1313
import {AaveStewardInjectorEMode} from '../../src/contracts/AaveStewardInjectorEMode.sol';
14+
import {GelatoAaveStewardInjectorEMode} from '../../src/contracts/gelato/GelatoAaveStewardInjectorEMode.sol';
1415

1516
library DeployStewardContracts {
1617
function _deployRiskStewards(
@@ -32,17 +33,21 @@ library DeployStewardContracts {
3233
address edgeRiskOracle,
3334
address owner,
3435
address guardian,
35-
uint8[] memory whitelistedEModes
36+
uint8[] memory whitelistedEModes,
37+
bool isGelatoInjector
3638
) internal returns (address) {
3739
address[] memory whitelistedMarkets = new address[](whitelistedEModes.length);
3840
for (uint256 i = 0; i < whitelistedEModes.length; i++) {
3941
whitelistedMarkets[i] = address(uint160(whitelistedEModes[i]));
4042
}
4143

44+
bytes memory injectorCode = isGelatoInjector ?
45+
type(GelatoAaveStewardInjectorEMode).creationCode : type(AaveStewardInjectorEMode).creationCode;
46+
4247
address stewardInjector = ICreate3Factory(create3Factory).create(
4348
salt,
4449
abi.encodePacked(
45-
type(AaveStewardInjectorEMode).creationCode,
50+
injectorCode,
4651
abi.encode(edgeRiskOracle, riskSteward, whitelistedMarkets, owner, guardian)
4752
)
4853
);
@@ -131,7 +136,8 @@ contract DeployEthereum is EthereumScript {
131136
EDGE_RISK_ORACLE,
132137
GovernanceV3Ethereum.EXECUTOR_LVL_1,
133138
GUARDIAN,
134-
whitelistedEModes
139+
whitelistedEModes,
140+
false
135141
);
136142
vm.stopBroadcast();
137143
}
@@ -145,7 +151,7 @@ contract DeployPlasma is PlasmaScript {
145151

146152
function run() external {
147153
vm.startBroadcast();
148-
bytes32 salt = 'EModeStewardInjector';
154+
bytes32 salt = 'EModeStewardInjectorV2';
149155
address predictedStewardsInjector = ICreate3Factory(CREATE_3_FACTORY)
150156
.predictAddress(msg.sender, salt);
151157

@@ -165,7 +171,8 @@ contract DeployPlasma is PlasmaScript {
165171
EDGE_RISK_ORACLE,
166172
GovernanceV3Plasma.EXECUTOR_LVL_1,
167173
GUARDIAN,
168-
whitelistedEModes
174+
whitelistedEModes,
175+
true
169176
);
170177
vm.stopBroadcast();
171178
}

scripts/deploy/DeployRateInjector.s.sol

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ pragma solidity ^0.8.0;
33

44
import 'solidity-utils/contracts/utils/ScriptUtils.sol';
55
import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol';
6+
import {MiscLinea} from 'aave-address-book/MiscLinea.sol';
67
import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol';
8+
import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol';
9+
import {AaveV3Linea, AaveV3LineaAssets} from 'aave-address-book/AaveV3Linea.sol';
710
import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
11+
import {GovernanceV3Linea} from 'aave-address-book/GovernanceV3Linea.sol';
812
import {ICreate3Factory} from 'solidity-utils/contracts/create3/interfaces/ICreate3Factory.sol';
913
import {EdgeRiskStewardRates, IRiskSteward} from '../../src/contracts/EdgeRiskStewardRates.sol';
1014
import {AaveStewardInjectorRates} from '../../src/contracts/AaveStewardInjectorRates.sol';
15+
import {GelatoAaveStewardInjectorRates} from '../../src/contracts/gelato/GelatoAaveStewardInjectorRates.sol';
1116

1217
library DeployStewardContracts {
1318
function _deployRiskStewards(
@@ -22,7 +27,7 @@ library DeployStewardContracts {
2227
configEngine,
2328
riskCouncil,
2429
governance,
25-
_getRiskConfig()
30+
_getSlope2RiskConfig()
2631
)
2732
);
2833
return riskSteward;
@@ -35,21 +40,29 @@ library DeployStewardContracts {
3540
address edgeRiskOracle,
3641
address owner,
3742
address guardian,
38-
address whitelistedAsset
43+
address[] memory markets,
44+
bool isGelatoInjector
3945
) internal returns (address) {
40-
address[] memory markets = new address[](1);
41-
markets[0] = whitelistedAsset;
46+
bytes memory injectorCode = isGelatoInjector ?
47+
type(GelatoAaveStewardInjectorRates).creationCode : type(AaveStewardInjectorRates).creationCode;
4248

4349
address stewardInjector = ICreate3Factory(create3Factory).create(
4450
salt,
4551
abi.encodePacked(
46-
type(AaveStewardInjectorRates).creationCode,
52+
injectorCode,
4753
abi.encode(edgeRiskOracle, riskSteward, markets, owner, guardian)
4854
)
4955
);
5056
return stewardInjector;
5157
}
5258

59+
function _getSlope2RiskConfig() internal pure returns (IRiskSteward.Config memory) {
60+
IRiskSteward.Config memory config;
61+
config.rateConfig.variableRateSlope2 = IRiskSteward.RiskParamConfig({minDelay: 8 hours, maxPercentChange: 4_00});
62+
63+
return config;
64+
}
65+
5366
function _getRiskConfig() internal pure returns (IRiskSteward.Config memory) {
5467
return
5568
IRiskSteward.Config({
@@ -101,14 +114,94 @@ contract DeployEthereumLido is EthereumScript {
101114
GovernanceV3Ethereum.EXECUTOR_LVL_1
102115
);
103116

117+
address[] memory whitelistedAssets = new address[](1);
118+
whitelistedAssets[0] = AaveV3EthereumLidoAssets.WETH_UNDERLYING;
119+
120+
DeployStewardContracts._deployRatesStewardInjector(
121+
MiscEthereum.CREATE_3_FACTORY,
122+
salt,
123+
riskSteward,
124+
EDGE_RISK_ORACLE,
125+
GovernanceV3Ethereum.EXECUTOR_LVL_1,
126+
GUARDIAN,
127+
whitelistedAssets,
128+
false
129+
);
130+
vm.stopBroadcast();
131+
}
132+
}
133+
134+
// make deploy-ledger contract=scripts/deploy/DeployRateInjector.s.sol:DeployEthereum chain=mainnet
135+
contract DeployEthereum is EthereumScript {
136+
address constant GUARDIAN = 0xff37939808EcF199A2D599ef91D699Fb13dab7F7;
137+
address constant EDGE_RISK_ORACLE = 0x7ABB46C690C52E919687D19ebF89C81A6136C1F2;
138+
139+
function run() external {
140+
vm.startBroadcast();
141+
bytes32 salt = 'StewardInjectorCoreV1';
142+
address predictedStewardsInjector = ICreate3Factory(MiscEthereum.CREATE_3_FACTORY)
143+
.predictAddress(msg.sender, salt);
144+
145+
address riskSteward = DeployStewardContracts._deployRiskStewards(
146+
address(AaveV3Ethereum.POOL),
147+
AaveV3Ethereum.CONFIG_ENGINE,
148+
predictedStewardsInjector,
149+
GovernanceV3Ethereum.EXECUTOR_LVL_1
150+
);
151+
152+
address[] memory whitelistedAssets = new address[](4);
153+
whitelistedAssets[0] = AaveV3EthereumAssets.WETH_UNDERLYING;
154+
whitelistedAssets[1] = AaveV3EthereumAssets.USDC_UNDERLYING;
155+
whitelistedAssets[2] = AaveV3EthereumAssets.USDT_UNDERLYING;
156+
whitelistedAssets[3] = AaveV3EthereumAssets.USDe_UNDERLYING;
157+
104158
DeployStewardContracts._deployRatesStewardInjector(
105159
MiscEthereum.CREATE_3_FACTORY,
106160
salt,
107161
riskSteward,
108162
EDGE_RISK_ORACLE,
109163
GovernanceV3Ethereum.EXECUTOR_LVL_1,
110164
GUARDIAN,
111-
AaveV3EthereumLidoAssets.WETH_UNDERLYING
165+
whitelistedAssets,
166+
false
167+
);
168+
vm.stopBroadcast();
169+
}
170+
}
171+
172+
// make deploy-ledger contract=scripts/deploy/DeployRateInjector.s.sol:DeployLinea chain=linea
173+
contract DeployLinea is LineaScript {
174+
address constant GUARDIAN = 0x0c28C535CE08345851F150dFC9c737978d726aEc;
175+
address constant EDGE_RISK_ORACLE = 0xa6C229d3a1D4D31708B16C0ad2f14337aE4E7893;
176+
address constant CREATE_3_FACTORY = 0x194a5828Fddf8782e6570149f0B2d31F8a1B89b6;
177+
178+
function run() external {
179+
vm.startBroadcast();
180+
bytes32 salt = 'StewardInjectorV3';
181+
address predictedStewardsInjector = ICreate3Factory(CREATE_3_FACTORY)
182+
.predictAddress(msg.sender, salt);
183+
184+
address riskSteward = DeployStewardContracts._deployRiskStewards(
185+
address(AaveV3Linea.POOL),
186+
AaveV3Linea.CONFIG_ENGINE,
187+
predictedStewardsInjector,
188+
GovernanceV3Linea.EXECUTOR_LVL_1
189+
);
190+
191+
address[] memory whitelistedAssets = new address[](3);
192+
whitelistedAssets[0] = AaveV3LineaAssets.WETH_UNDERLYING;
193+
whitelistedAssets[1] = AaveV3LineaAssets.USDC_UNDERLYING;
194+
whitelistedAssets[2] = AaveV3LineaAssets.USDT_UNDERLYING;
195+
196+
DeployStewardContracts._deployRatesStewardInjector(
197+
CREATE_3_FACTORY,
198+
salt,
199+
riskSteward,
200+
EDGE_RISK_ORACLE,
201+
GovernanceV3Linea.EXECUTOR_LVL_1,
202+
GUARDIAN,
203+
whitelistedAssets,
204+
true
112205
);
113206
vm.stopBroadcast();
114207
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {AaveStewardInjectorDiscountRate, AaveStewardInjectorBase} from '../AaveStewardInjectorDiscountRate.sol';
5+
6+
/**
7+
* @title GelatoAaveStewardInjectorDiscountRate
8+
* @author BGD Labs
9+
* @notice Contract to perform pendle discountRate update automation using Gelato.
10+
*/
11+
contract GelatoAaveStewardInjectorDiscountRate is AaveStewardInjectorDiscountRate {
12+
/**
13+
* @param aaveOracle address of the aave oracle of the instance.
14+
* @param riskOracle address of the edge risk oracle contract.
15+
* @param riskSteward address of the risk steward contract.
16+
* @param markets list of market addresses to allow.
17+
* @param owner address of the owner of the stewards injector.
18+
* @param guardian address of the guardian of the stewards injector.
19+
*/
20+
constructor(
21+
address aaveOracle,
22+
address riskOracle,
23+
address riskSteward,
24+
address[] memory markets,
25+
address owner,
26+
address guardian
27+
) AaveStewardInjectorDiscountRate(aaveOracle, riskOracle, riskSteward, markets, owner, guardian) {}
28+
29+
/**
30+
* @inheritdoc AaveStewardInjectorBase
31+
* @dev the returned bytes is specific to gelato and is encoded with the function selector.
32+
*/
33+
function checkUpkeep(bytes memory) public view override returns (bool, bytes memory) {
34+
(bool upkeepNeeded, bytes memory encodedActionDataToExecute) = super.checkUpkeep('');
35+
return (upkeepNeeded, abi.encodeCall(this.performUpkeep, encodedActionDataToExecute));
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {AaveStewardInjectorEMode, AaveStewardInjectorBase} from '../AaveStewardInjectorEMode.sol';
5+
6+
/**
7+
* @title GelatoAaveStewardInjectorEMode
8+
* @author BGD Labs
9+
* @notice Contract to perform EMode category update automation using Gelato.
10+
*/
11+
contract GelatoAaveStewardInjectorEMode is AaveStewardInjectorEMode {
12+
/**
13+
* @param riskOracle address of the edge risk oracle contract.
14+
* @param riskSteward address of the risk steward contract.
15+
* @param markets list of market addresses to allow.
16+
* @param owner address of the owner of the stewards injector.
17+
* @param guardian address of the guardian of the stewards injector.
18+
*/
19+
constructor(
20+
address riskOracle,
21+
address riskSteward,
22+
address[] memory markets,
23+
address owner,
24+
address guardian
25+
) AaveStewardInjectorEMode(riskOracle, riskSteward, markets, owner, guardian) {}
26+
27+
/**
28+
* @inheritdoc AaveStewardInjectorBase
29+
* @dev the returned bytes is specific to gelato and is encoded with the function selector.
30+
*/
31+
function checkUpkeep(bytes memory) public view override returns (bool, bytes memory) {
32+
(bool upkeepNeeded, bytes memory encodedActionDataToExecute) = super.checkUpkeep('');
33+
return (upkeepNeeded, abi.encodeCall(this.performUpkeep, encodedActionDataToExecute));
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {AaveStewardInjectorRates, AaveStewardInjectorBase} from '../AaveStewardInjectorRates.sol';
5+
6+
/**
7+
* @title GelatoAaveStewardInjectorRates
8+
* @author BGD Labs
9+
* @notice Contract to perform interest rate update automation using Gelato.
10+
*/
11+
contract GelatoAaveStewardInjectorRates is AaveStewardInjectorRates {
12+
/**
13+
* @param riskOracle address of the edge risk oracle contract.
14+
* @param riskSteward address of the risk steward contract.
15+
* @param markets list of market addresses to allow.
16+
* @param owner address of the owner of the stewards injector.
17+
* @param guardian address of the guardian of the stewards injector.
18+
*/
19+
constructor(
20+
address riskOracle,
21+
address riskSteward,
22+
address[] memory markets,
23+
address owner,
24+
address guardian
25+
) AaveStewardInjectorRates(riskOracle, riskSteward, markets, owner, guardian) {}
26+
27+
/**
28+
* @inheritdoc AaveStewardInjectorBase
29+
* @dev the returned bytes is specific to gelato and is encoded with the function selector.
30+
*/
31+
function checkUpkeep(bytes memory) public view override returns (bool, bytes memory) {
32+
(bool upkeepNeeded, bytes memory encodedActionDataToExecute) = super.checkUpkeep('');
33+
return (upkeepNeeded, abi.encodeCall(this.performUpkeep, encodedActionDataToExecute));
34+
}
35+
}

0 commit comments

Comments
 (0)