Skip to content

Commit b2bafa9

Browse files
feat: gelato wrapper for cap injector and deploy scripts (#53)
* feat: gelato wrapper for cap injector and deploy scripts * chore: fix test * chore: remove redundant check
1 parent 189a4a7 commit b2bafa9

9 files changed

+306
-21
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ git-diff :
2828
@printf '%s\n%s\n%s\n' "\`\`\`diff" "$$(git diff --no-index --diff-algorithm=patience --ignore-space-at-eol ${before} ${after})" "\`\`\`" > diffs/${out}.md
2929

3030
# Deploy
31-
deploy-ledger :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --verify -vvvv --slow --broadcast)
32-
deploy-pk :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --private-key ${PRIVATE_KEY} --verify -vvvv --slow --broadcast)
31+
deploy-ledger :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --verify --verifier etherscan -vvvv --slow --broadcast)
32+
deploy-pk :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --private-key ${PRIVATE_KEY} --verify --verifier etherscan -vvvv --slow --broadcast --verifier etherscan)
3333

3434

35-
run-script:; FOUNDRY_PROFILE=${network} forge script $(if $(filter zksync,${network}),--zksync) ${contract} --rpc-url ${network} --sig "run(bool, bool, bool)" ${broadcast} ${generate_diff} ${skip_timelock} -vv
35+
run-script:; FOUNDRY_PROFILE=${network} forge script $(if $(filter zksync,${network}),--zksync) ${contract} --rpc-url ${network} --sig "run(bool, bool, bool)" ${broadcast} ${generate_diff} ${skip_timelock} -vv

scripts/deploy/DeployCapInjector.s.sol

Lines changed: 194 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,25 @@ pragma solidity ^0.8.0;
44
import 'solidity-utils/contracts/utils/ScriptUtils.sol';
55
import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol';
66
import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol';
7+
import {MiscOptimism} from 'aave-address-book/MiscOptimism.sol';
8+
import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol';
9+
import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol';
10+
import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol';
11+
import {MiscGnosis} from 'aave-address-book/MiscGnosis.sol';
12+
import {AaveV3Gnosis, AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol';
13+
import {MiscBNB} from 'aave-address-book/MiscBNB.sol';
14+
import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol';
715
import {GovernanceV3Arbitrum} from 'aave-address-book/GovernanceV3Arbitrum.sol';
16+
import {GovernanceV3Optimism} from 'aave-address-book/GovernanceV3Optimism.sol';
17+
import {GovernanceV3Polygon} from 'aave-address-book/GovernanceV3Polygon.sol';
18+
import {GovernanceV3Gnosis} from 'aave-address-book/GovernanceV3Gnosis.sol';
19+
import {GovernanceV3BNB} from 'aave-address-book/GovernanceV3BNB.sol';
820
import {ICreate3Factory} from 'solidity-utils/contracts/create3/interfaces/ICreate3Factory.sol';
921
import {EdgeRiskStewardCaps, IRiskSteward} from '../../src/contracts/EdgeRiskStewardCaps.sol';
1022
import {AaveStewardInjectorCaps} from '../../src/contracts/AaveStewardInjectorCaps.sol';
23+
import {GelatoAaveStewardInjectorCaps} from '../../src/contracts/gelato/GelatoAaveStewardInjectorCaps.sol';
1124

1225
library DeployStewardContracts {
13-
address constant EDGE_RISK_ORACLE = 0x861eeAdB55E41f161F31Acb1BFD4c70E3a964Aed;
14-
1526
function _deployRiskStewards(
1627
address pool,
1728
address configEngine,
@@ -32,16 +43,22 @@ library DeployStewardContracts {
3243

3344
function _deployCapsStewardInjector(
3445
bytes32 salt,
46+
address create3Factory,
3547
address riskSteward,
3648
address owner,
3749
address guardian,
38-
address[] memory whitelistedMarkets
50+
address[] memory whitelistedMarkets,
51+
address riskOracle,
52+
bool isGelatoInjector
3953
) internal returns (address) {
40-
address stewardInjector = ICreate3Factory(MiscArbitrum.CREATE_3_FACTORY).create(
54+
bytes memory injectorCode = isGelatoInjector ?
55+
type(GelatoAaveStewardInjectorCaps).creationCode : type(AaveStewardInjectorCaps).creationCode;
56+
57+
address stewardInjector = ICreate3Factory(create3Factory).create(
4158
salt,
4259
abi.encodePacked(
43-
type(AaveStewardInjectorCaps).creationCode,
44-
abi.encode(EDGE_RISK_ORACLE, riskSteward, whitelistedMarkets, owner, guardian)
60+
injectorCode,
61+
abi.encode(riskOracle, riskSteward, whitelistedMarkets, owner, guardian)
4562
)
4663
);
4764
return stewardInjector;
@@ -83,10 +100,11 @@ library DeployStewardContracts {
83100
// make deploy-ledger contract=scripts/deploy/DeployCapInjector.s.sol:DeployArbitrum chain=arbitrum
84101
contract DeployArbitrum is ArbitrumScript {
85102
address constant GUARDIAN = 0x87dFb794364f2B117C8dbaE29EA622938b3Ce465;
103+
address constant RISK_ORACLE = 0x861eeAdB55E41f161F31Acb1BFD4c70E3a964Aed;
86104

87105
function run() external {
88106
vm.startBroadcast();
89-
bytes32 salt = 'CapsStewardInjector';
107+
bytes32 salt = 'CapStewardInjector';
90108
address predictedStewardsInjector = ICreate3Factory(MiscArbitrum.CREATE_3_FACTORY)
91109
.predictAddress(msg.sender, salt);
92110

@@ -116,10 +134,178 @@ contract DeployArbitrum is ArbitrumScript {
116134

117135
DeployStewardContracts._deployCapsStewardInjector(
118136
salt,
137+
MiscArbitrum.CREATE_3_FACTORY,
119138
riskSteward,
120139
GovernanceV3Arbitrum.EXECUTOR_LVL_1,
121140
GUARDIAN,
122-
whitelistedMarkets
141+
whitelistedMarkets,
142+
RISK_ORACLE,
143+
false
144+
);
145+
vm.stopBroadcast();
146+
}
147+
}
148+
149+
// make deploy-ledger contract=scripts/deploy/DeployCapInjector.s.sol:DeployOptimism chain=optimism
150+
contract DeployOptimism is OptimismScript {
151+
address constant GUARDIAN = 0x9867Ce43D2a574a152fE6b134F64c9578ce3cE03;
152+
address constant RISK_ORACLE = 0x9f6aA2aB14bFF53e4b79A81ce1554F1DFdbb6608;
153+
154+
function run() external {
155+
vm.startBroadcast();
156+
bytes32 salt = 'CapStewardInjector';
157+
address predictedStewardsInjector = ICreate3Factory(MiscOptimism.CREATE_3_FACTORY)
158+
.predictAddress(msg.sender, salt);
159+
160+
address riskSteward = DeployStewardContracts._deployRiskStewards(
161+
address(AaveV3Optimism.POOL),
162+
AaveV3Optimism.CONFIG_ENGINE,
163+
predictedStewardsInjector,
164+
GovernanceV3Optimism.EXECUTOR_LVL_1
165+
);
166+
167+
address[] memory whitelistedMarkets = new address[](7);
168+
whitelistedMarkets[0] = AaveV3OptimismAssets.WETH_A_TOKEN;
169+
whitelistedMarkets[1] = AaveV3OptimismAssets.USDT_A_TOKEN;
170+
whitelistedMarkets[2] = AaveV3OptimismAssets.WBTC_A_TOKEN;
171+
whitelistedMarkets[3] = AaveV3OptimismAssets.USDCn_A_TOKEN;
172+
whitelistedMarkets[4] = AaveV3OptimismAssets.wstETH_A_TOKEN;
173+
whitelistedMarkets[5] = AaveV3OptimismAssets.rETH_A_TOKEN;
174+
whitelistedMarkets[6] = AaveV3OptimismAssets.OP_A_TOKEN;
175+
176+
DeployStewardContracts._deployCapsStewardInjector(
177+
salt,
178+
MiscOptimism.CREATE_3_FACTORY,
179+
riskSteward,
180+
GovernanceV3Optimism.EXECUTOR_LVL_1,
181+
GUARDIAN,
182+
whitelistedMarkets,
183+
RISK_ORACLE,
184+
false
185+
);
186+
vm.stopBroadcast();
187+
}
188+
}
189+
190+
// make deploy-ledger contract=scripts/deploy/DeployCapInjector.s.sol:DeployPolygon chain=polygon
191+
contract DeployPolygon is PolygonScript {
192+
address constant GUARDIAN = 0x7683177b05a92e8B169D833718BDF9d0ce809aA9;
193+
address constant RISK_ORACLE = 0x9f6aA2aB14bFF53e4b79A81ce1554F1DFdbb6608;
194+
195+
function run() external {
196+
vm.startBroadcast();
197+
bytes32 salt = 'CapStewardInjector';
198+
address predictedStewardsInjector = ICreate3Factory(MiscPolygon.CREATE_3_FACTORY)
199+
.predictAddress(msg.sender, salt);
200+
201+
address riskSteward = DeployStewardContracts._deployRiskStewards(
202+
address(AaveV3Polygon.POOL),
203+
AaveV3Polygon.CONFIG_ENGINE,
204+
predictedStewardsInjector,
205+
GovernanceV3Polygon.EXECUTOR_LVL_1
206+
);
207+
208+
address[] memory whitelistedMarkets = new address[](10);
209+
whitelistedMarkets[0] = AaveV3PolygonAssets.WETH_A_TOKEN;
210+
whitelistedMarkets[1] = AaveV3PolygonAssets.USDC_A_TOKEN;
211+
whitelistedMarkets[2] = AaveV3PolygonAssets.USDT_A_TOKEN;
212+
whitelistedMarkets[3] = AaveV3PolygonAssets.WBTC_A_TOKEN;
213+
whitelistedMarkets[4] = AaveV3PolygonAssets.DAI_A_TOKEN;
214+
whitelistedMarkets[5] = AaveV3PolygonAssets.USDCn_A_TOKEN;
215+
whitelistedMarkets[6] = AaveV3PolygonAssets.LINK_A_TOKEN;
216+
whitelistedMarkets[7] = AaveV3PolygonAssets.wstETH_A_TOKEN;
217+
whitelistedMarkets[8] = AaveV3PolygonAssets.WPOL_A_TOKEN;
218+
whitelistedMarkets[9] = AaveV3PolygonAssets.AAVE_A_TOKEN;
219+
220+
DeployStewardContracts._deployCapsStewardInjector(
221+
salt,
222+
MiscPolygon.CREATE_3_FACTORY,
223+
riskSteward,
224+
GovernanceV3Polygon.EXECUTOR_LVL_1,
225+
GUARDIAN,
226+
whitelistedMarkets,
227+
RISK_ORACLE,
228+
false
229+
);
230+
vm.stopBroadcast();
231+
}
232+
}
233+
234+
// make deploy-ledger contract=scripts/deploy/DeployCapInjector.s.sol:DeployGnosis chain=gnosis
235+
contract DeployGnosis is GnosisScript {
236+
address constant GUARDIAN = 0x4bBBcfF03E94B2B661c5cA9c3BD34f6504591764;
237+
address constant RISK_ORACLE = 0x7BD97DD6C199532d11Cf5f55E13a120dB6dd0F4F;
238+
239+
function run() external {
240+
vm.startBroadcast();
241+
bytes32 salt = 'CapStewardInjectorV2';
242+
address predictedStewardsInjector = ICreate3Factory(MiscGnosis.CREATE_3_FACTORY)
243+
.predictAddress(msg.sender, salt);
244+
245+
address riskSteward = DeployStewardContracts._deployRiskStewards(
246+
address(AaveV3Gnosis.POOL),
247+
AaveV3Gnosis.CONFIG_ENGINE,
248+
predictedStewardsInjector,
249+
GovernanceV3Gnosis.EXECUTOR_LVL_1
250+
);
251+
252+
address[] memory whitelistedMarkets = new address[](6);
253+
whitelistedMarkets[0] = AaveV3GnosisAssets.WETH_A_TOKEN;
254+
whitelistedMarkets[1] = AaveV3GnosisAssets.USDCe_A_TOKEN;
255+
whitelistedMarkets[2] = AaveV3GnosisAssets.sDAI_A_TOKEN;
256+
whitelistedMarkets[3] = AaveV3GnosisAssets.EURe_A_TOKEN;
257+
whitelistedMarkets[4] = AaveV3GnosisAssets.GNO_A_TOKEN;
258+
whitelistedMarkets[5] = AaveV3GnosisAssets.wstETH_A_TOKEN;
259+
260+
DeployStewardContracts._deployCapsStewardInjector(
261+
salt,
262+
MiscGnosis.CREATE_3_FACTORY,
263+
riskSteward,
264+
GovernanceV3Gnosis.EXECUTOR_LVL_1,
265+
GUARDIAN,
266+
whitelistedMarkets,
267+
RISK_ORACLE,
268+
true
269+
);
270+
vm.stopBroadcast();
271+
}
272+
}
273+
274+
// make deploy-ledger contract=scripts/deploy/DeployCapInjector.s.sol:DeployBNB chain=bnb
275+
contract DeployBNB is BNBScript {
276+
address constant GUARDIAN = 0xB5ABc2BcB050bE70EF53338E547d87d06F7c877d;
277+
address constant RISK_ORACLE = 0x239d3Bc5fa247337287cb03f53B8bc63DBBc332D;
278+
279+
function run() external {
280+
vm.startBroadcast();
281+
bytes32 salt = 'CapStewardInjector';
282+
address predictedStewardsInjector = ICreate3Factory(MiscBNB.CREATE_3_FACTORY)
283+
.predictAddress(msg.sender, salt);
284+
285+
address riskSteward = DeployStewardContracts._deployRiskStewards(
286+
address(AaveV3BNB.POOL),
287+
AaveV3BNB.CONFIG_ENGINE,
288+
predictedStewardsInjector,
289+
GovernanceV3BNB.EXECUTOR_LVL_1
290+
);
291+
292+
address[] memory whitelistedMarkets = new address[](6);
293+
whitelistedMarkets[0] = AaveV3BNBAssets.BTCB_A_TOKEN;
294+
whitelistedMarkets[1] = AaveV3BNBAssets.WBNB_A_TOKEN;
295+
whitelistedMarkets[2] = AaveV3BNBAssets.USDT_A_TOKEN;
296+
whitelistedMarkets[3] = AaveV3BNBAssets.USDC_A_TOKEN;
297+
whitelistedMarkets[4] = AaveV3BNBAssets.ETH_A_TOKEN;
298+
whitelistedMarkets[5] = AaveV3BNBAssets.wstETH_A_TOKEN;
299+
300+
DeployStewardContracts._deployCapsStewardInjector(
301+
salt,
302+
MiscArbitrum.CREATE_3_FACTORY,
303+
riskSteward,
304+
GovernanceV3BNB.EXECUTOR_LVL_1,
305+
GUARDIAN,
306+
whitelistedMarkets,
307+
RISK_ORACLE,
308+
false
123309
);
124310
vm.stopBroadcast();
125311
}
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 {AaveStewardInjectorCaps, AaveStewardInjectorBase} from '../AaveStewardInjectorCaps.sol';
5+
6+
/**
7+
* @title GelatoAaveStewardInjectorCaps
8+
* @author BGD Labs
9+
* @notice Contract to perform caps update automation using Gelato.
10+
*/
11+
contract GelatoAaveStewardInjectorCaps is AaveStewardInjectorCaps {
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+
) AaveStewardInjectorCaps(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+
}

tests/AaveStewardInjectorDiscountRate.t.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ contract AaveStewardsInjectorDiscountRate_Test is AaveStewardsInjectorBaseTest {
106106
address(this),
107107
config
108108
);
109-
vm.assertEq(computedRiskStewardAddress, address(_riskSteward));
110109
vm.stopPrank();
111110

112111
vm.prank(poolAdmin);

tests/AaveStewardInjectorEMode.t.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ contract AaveStewardsInjectorEMode_Test is AaveStewardsInjectorBaseTest {
6767
address(this),
6868
riskConfig
6969
);
70-
vm.assertEq(computedRiskStewardAddress, address(_riskSteward));
7170
vm.stopPrank();
7271

7372
vm.startPrank(poolAdmin);

tests/AaveStewardsInjectorBase.t.sol

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,12 @@ abstract contract AaveStewardsInjectorBaseTest is TestnetProcedures {
139139
vm.expectEmit(address(_stewardInjector));
140140
emit IAaveStewardInjectorBase.ActionSucceeded(1);
141141

142-
(bool shouldRunKeeper, bytes memory performData) = _stewardInjector.checkUpkeep('');
143-
_stewardInjector.performUpkeep(performData);
144-
assertTrue(shouldRunKeeper);
142+
(, bytes memory performData) = _stewardInjector.checkUpkeep('');
143+
bool isAutomationPerformed = _checkAndPerformAutomation();
144+
assertTrue(isAutomationPerformed);
145145

146146
vm.expectRevert(IAaveStewardInjectorBase.UpdateCannotBeInjected.selector);
147-
_stewardInjector.performUpkeep(performData);
147+
_performAutomation(performData);
148148
}
149149

150150
function test_addMarkets() public {
@@ -237,4 +237,8 @@ abstract contract AaveStewardsInjectorBaseTest is TestnetProcedures {
237237
}
238238
return shouldRunKeeper;
239239
}
240+
241+
function _performAutomation(bytes memory performData) internal virtual {
242+
_stewardInjector.performUpkeep(performData);
243+
}
240244
}

tests/AaveStewardsInjectorCaps.t.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ contract AaveStewardsInjectorCaps_Test is AaveStewardsInjectorBaseTest {
1313
address internal _aWETH;
1414
address internal _aWBTC;
1515

16-
function setUp() public override {
16+
function setUp() public virtual override {
1717
super.setUp();
1818

1919
IRiskSteward.RiskParamConfig memory defaultRiskParamConfig = IRiskSteward.RiskParamConfig({
@@ -65,7 +65,6 @@ contract AaveStewardsInjectorCaps_Test is AaveStewardsInjectorBaseTest {
6565
address(this),
6666
riskConfig
6767
);
68-
vm.assertEq(computedRiskStewardAddress, address(_riskSteward));
6968
vm.stopPrank();
7069

7170
vm.startPrank(poolAdmin);

tests/AaveStewardsInjectorRates.t.sol

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ contract AaveStewardsInjectorRates_Test is AaveStewardsInjectorBaseTest {
5656
address(this),
5757
riskConfig
5858
);
59-
60-
vm.assertEq(computedRiskStewardAddress, address(_riskSteward));
6159
vm.stopPrank();
6260

6361
vm.startPrank(poolAdmin);

0 commit comments

Comments
 (0)