Skip to content

Commit 5d5d8c7

Browse files
authored
Phase One Risk Param Updates (#25)
1 parent 8c29047 commit 5d5d8c7

File tree

6 files changed

+654
-9
lines changed

6 files changed

+654
-9
lines changed

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ deploy-phase-one-payload :;
7676
--verify --chain ${CHAIN} --verifier-url ${VERIFIER_URL} \
7777
--sig "run(string)" ${reportPath}
7878

79+
# STEP 5: Deploys payload to update phase one assets. `make deploy-phase-one-update-payload`
80+
deploy-phase-one-update-payload :;
81+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/misc/DeployHorizonPhaseOneUpdatePayload.sol:DeployHorizonPhaseOneUpdatePayload \
82+
--rpc-url ${CHAIN} --account ${ACCOUNT} --slow --gas-estimate-multiplier 150 \
83+
--chain ${CHAIN} --verifier etherscan \
84+
--sig "run()" \
85+
--verify --broadcast
86+
7987
# Invariants
8088
echidna:
8189
echidna tests/invariants/Tester.t.sol --contract Tester --config ./tests/invariants/_config/echidna_config.yaml --corpus-dir ./tests/invariants/_corpus/echidna/default/_data/corpus

docs/Horizon/Horizon-overview.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ All other existing functionality remains unchanged from v3.3. Stablecoins, or ot
8787
- borrowingEnabled: true
8888
- borrowableInIsolation: true
8989
- withSiloedBorrowing: false
90-
- flashloanable: true (authorized flashborrowers can be configured)
90+
- flashloanable: false
9191
- LTV: 0
9292
- liquidationThreshold: 0 (to disable its use as collateral)
9393
- liquidationBonus: N/A (can be 0)
@@ -97,11 +97,11 @@ All other existing functionality remains unchanged from v3.3. Stablecoins, or ot
9797
- debtCeiling: 0 (only applies to isolated asset)
9898
- liquidationProtocolFee: 0 (as it won't apply for a non-collateral asset)
9999

100-
Stablecoins, or other non-RWA permissionless assets, may also be configured as collateral in the future, by setting `liquidationThreshold` above `0`. In such case, natively permissionless borrowing would therefore be enabled within the instance.
100+
Stablecoins, or other non-RWA permissionless assets, may also be configured as collateral in the future, by setting `liquidationThreshold` above `0`. In such case, natively permissionless borrowing would therefore be enabled within the instance. Flashloans and authorized flashborrowers may be configured in the future.
101101

102102
## Edge Cases of Note
103103

104-
Consider the following scenarios involving the example permissioned `RWA_1` token.
104+
Consider the following scenarios involving the example permissioned `RWA_1` token. Flashloans may be utilized from other protocols if disabled in Horizon.
105105

106106
### RWA Holder Loses Private Keys to Wallet
107107

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {HorizonPhaseOneUpdate} from '../../src/deployments/inputs/HorizonPhaseOneUpdate.sol';
5+
import {Script} from 'forge-std/Script.sol';
6+
7+
contract DeployHorizonPhaseOneUpdatePayload is Script {
8+
address public constant CONFIG_ENGINE = 0x366D1e3F41Ad5CC699bb8FC0B41323C68d895E2c; // horizon
9+
10+
function run() public returns (address) {
11+
vm.startBroadcast();
12+
HorizonPhaseOneUpdate horizonPhaseOneUpdate = new HorizonPhaseOneUpdate(CONFIG_ENGINE);
13+
vm.stopBroadcast();
14+
15+
return address(horizonPhaseOneUpdate);
16+
}
17+
}
Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {IAaveV3ConfigEngine as IEngine} from '../../contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol';
5+
import {EngineFlags} from '../../contracts/extensions/v3-config-engine/EngineFlags.sol';
6+
import {AaveV3Payload} from '../../contracts/extensions/v3-config-engine/AaveV3Payload.sol';
7+
8+
contract HorizonPhaseOneUpdate is AaveV3Payload {
9+
address public constant GHO_ADDRESS = 0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f;
10+
address public constant USDC_ADDRESS = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
11+
address public constant RLUSD_ADDRESS = 0x8292Bb45bf1Ee4d140127049757C2E0fF06317eD;
12+
address public constant USTB_ADDRESS = 0x43415eB6ff9DB7E26A15b704e7A3eDCe97d31C4e;
13+
address public constant USCC_ADDRESS = 0x14d60E7FDC0D71d8611742720E4C50E7a974020c;
14+
address public constant USYC_ADDRESS = 0x136471a34f6ef19fE571EFFC1CA711fdb8E49f2b;
15+
address public constant JTRSY_ADDRESS = 0x8c213ee79581Ff4984583C6a801e5263418C4b86;
16+
address public constant JAAA_ADDRESS = 0x5a0F93D040De44e78F251b03c43be9CF317Dcf64;
17+
18+
constructor(address configEngine) AaveV3Payload(IEngine(configEngine)) {}
19+
20+
function capsUpdates() public view override returns (IEngine.CapsUpdate[] memory) {
21+
IEngine.CapsUpdate[] memory caps = new IEngine.CapsUpdate[](8);
22+
23+
caps[0] = IEngine.CapsUpdate({
24+
asset: USTB_ADDRESS,
25+
supplyCap: 1_800_000,
26+
borrowCap: EngineFlags.KEEP_CURRENT
27+
});
28+
29+
caps[1] = IEngine.CapsUpdate({
30+
asset: USCC_ADDRESS,
31+
supplyCap: 960_000,
32+
borrowCap: EngineFlags.KEEP_CURRENT
33+
});
34+
35+
caps[2] = IEngine.CapsUpdate({
36+
asset: USYC_ADDRESS,
37+
supplyCap: 10_300_000,
38+
borrowCap: EngineFlags.KEEP_CURRENT
39+
});
40+
41+
caps[3] = IEngine.CapsUpdate({
42+
asset: JTRSY_ADDRESS,
43+
supplyCap: 4_600_000,
44+
borrowCap: EngineFlags.KEEP_CURRENT
45+
});
46+
47+
caps[4] = IEngine.CapsUpdate({
48+
asset: JAAA_ADDRESS,
49+
supplyCap: 9_900_000,
50+
borrowCap: EngineFlags.KEEP_CURRENT
51+
});
52+
53+
caps[5] = IEngine.CapsUpdate({asset: GHO_ADDRESS, supplyCap: 1_000_000, borrowCap: 900_000});
54+
55+
caps[6] = IEngine.CapsUpdate({
56+
asset: RLUSD_ADDRESS,
57+
supplyCap: 30_000_000,
58+
borrowCap: 27_000_000
59+
});
60+
61+
caps[7] = IEngine.CapsUpdate({
62+
asset: USDC_ADDRESS,
63+
supplyCap: 16_000_000,
64+
borrowCap: 14_400_000
65+
});
66+
67+
return caps;
68+
}
69+
70+
function collateralsUpdates() public view override returns (IEngine.CollateralUpdate[] memory) {
71+
IEngine.CollateralUpdate[] memory collaterals = new IEngine.CollateralUpdate[](5);
72+
73+
collaterals[0] = IEngine.CollateralUpdate({
74+
asset: USTB_ADDRESS,
75+
ltv: 83_00,
76+
liqThreshold: 88_00,
77+
liqBonus: 3_00,
78+
debtCeiling: EngineFlags.KEEP_CURRENT,
79+
liqProtocolFee: EngineFlags.KEEP_CURRENT
80+
});
81+
82+
collaterals[1] = IEngine.CollateralUpdate({
83+
asset: USCC_ADDRESS,
84+
ltv: 73_00,
85+
liqThreshold: 80_00,
86+
liqBonus: 7_50,
87+
debtCeiling: EngineFlags.KEEP_CURRENT,
88+
liqProtocolFee: EngineFlags.KEEP_CURRENT
89+
});
90+
91+
collaterals[2] = IEngine.CollateralUpdate({
92+
asset: USYC_ADDRESS,
93+
ltv: 85_00,
94+
liqThreshold: 89_00,
95+
liqBonus: 3_10,
96+
debtCeiling: EngineFlags.KEEP_CURRENT,
97+
liqProtocolFee: EngineFlags.KEEP_CURRENT
98+
});
99+
100+
collaterals[3] = IEngine.CollateralUpdate({
101+
asset: JTRSY_ADDRESS,
102+
ltv: 77_00,
103+
liqThreshold: 83_00,
104+
liqBonus: 4_50,
105+
debtCeiling: EngineFlags.KEEP_CURRENT,
106+
liqProtocolFee: EngineFlags.KEEP_CURRENT
107+
});
108+
109+
collaterals[4] = IEngine.CollateralUpdate({
110+
asset: JAAA_ADDRESS,
111+
ltv: 71_00,
112+
liqThreshold: 78_00,
113+
liqBonus: 9_00,
114+
debtCeiling: EngineFlags.KEEP_CURRENT,
115+
liqProtocolFee: EngineFlags.KEEP_CURRENT
116+
});
117+
118+
return collaterals;
119+
}
120+
121+
function eModeCategoriesUpdates()
122+
public
123+
pure
124+
override
125+
returns (IEngine.EModeCategoryUpdate[] memory)
126+
{
127+
IEngine.EModeCategoryUpdate[] memory eModeCategories = new IEngine.EModeCategoryUpdate[](6);
128+
129+
// USTB Stablecoins
130+
eModeCategories[0] = IEngine.EModeCategoryUpdate({
131+
eModeCategory: 1,
132+
ltv: EngineFlags.KEEP_CURRENT,
133+
liqThreshold: EngineFlags.KEEP_CURRENT,
134+
liqBonus: EngineFlags.KEEP_CURRENT,
135+
label: ''
136+
});
137+
138+
// USCC Stablecoins
139+
eModeCategories[1] = IEngine.EModeCategoryUpdate({
140+
eModeCategory: 3,
141+
ltv: EngineFlags.KEEP_CURRENT,
142+
liqThreshold: EngineFlags.KEEP_CURRENT,
143+
liqBonus: EngineFlags.KEEP_CURRENT,
144+
label: ''
145+
});
146+
147+
// USCC GHO
148+
eModeCategories[2] = IEngine.EModeCategoryUpdate({
149+
eModeCategory: 4,
150+
ltv: 74_00,
151+
liqThreshold: 81_00,
152+
liqBonus: EngineFlags.KEEP_CURRENT,
153+
label: EngineFlags.KEEP_CURRENT_STRING
154+
});
155+
156+
// USYC Stablecoins
157+
eModeCategories[3] = IEngine.EModeCategoryUpdate({
158+
eModeCategory: 5,
159+
ltv: EngineFlags.KEEP_CURRENT,
160+
liqThreshold: EngineFlags.KEEP_CURRENT,
161+
liqBonus: EngineFlags.KEEP_CURRENT,
162+
label: ''
163+
});
164+
165+
// JTRSY Stablecoins
166+
eModeCategories[4] = IEngine.EModeCategoryUpdate({
167+
eModeCategory: 7,
168+
ltv: EngineFlags.KEEP_CURRENT,
169+
liqThreshold: EngineFlags.KEEP_CURRENT,
170+
liqBonus: EngineFlags.KEEP_CURRENT,
171+
label: ''
172+
});
173+
174+
// JAAA Stablecoins
175+
eModeCategories[5] = IEngine.EModeCategoryUpdate({
176+
eModeCategory: 9,
177+
ltv: EngineFlags.KEEP_CURRENT,
178+
liqThreshold: EngineFlags.KEEP_CURRENT,
179+
liqBonus: EngineFlags.KEEP_CURRENT,
180+
label: ''
181+
});
182+
183+
return eModeCategories;
184+
}
185+
186+
function assetsEModeUpdates() public view override returns (IEngine.AssetEModeUpdate[] memory) {
187+
IEngine.AssetEModeUpdate[] memory assetsEMode = new IEngine.AssetEModeUpdate[](20);
188+
189+
uint256 index = 0;
190+
191+
// USTB Stablecoins
192+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
193+
asset: USTB_ADDRESS,
194+
eModeCategory: 1,
195+
collateral: EngineFlags.DISABLED,
196+
borrowable: EngineFlags.KEEP_CURRENT
197+
});
198+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
199+
asset: USDC_ADDRESS,
200+
eModeCategory: 1,
201+
collateral: EngineFlags.KEEP_CURRENT,
202+
borrowable: EngineFlags.DISABLED
203+
});
204+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
205+
asset: RLUSD_ADDRESS,
206+
eModeCategory: 1,
207+
collateral: EngineFlags.KEEP_CURRENT,
208+
borrowable: EngineFlags.DISABLED
209+
});
210+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
211+
asset: GHO_ADDRESS,
212+
eModeCategory: 1,
213+
collateral: EngineFlags.KEEP_CURRENT,
214+
borrowable: EngineFlags.DISABLED
215+
});
216+
217+
// USCC Stablecoins
218+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
219+
asset: USCC_ADDRESS,
220+
eModeCategory: 3,
221+
collateral: EngineFlags.DISABLED,
222+
borrowable: EngineFlags.KEEP_CURRENT
223+
});
224+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
225+
asset: USDC_ADDRESS,
226+
eModeCategory: 3,
227+
collateral: EngineFlags.KEEP_CURRENT,
228+
borrowable: EngineFlags.DISABLED
229+
});
230+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
231+
asset: RLUSD_ADDRESS,
232+
eModeCategory: 3,
233+
collateral: EngineFlags.KEEP_CURRENT,
234+
borrowable: EngineFlags.DISABLED
235+
});
236+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
237+
asset: GHO_ADDRESS,
238+
eModeCategory: 3,
239+
collateral: EngineFlags.KEEP_CURRENT,
240+
borrowable: EngineFlags.DISABLED
241+
});
242+
243+
// USYC Stablecoins
244+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
245+
asset: USYC_ADDRESS,
246+
eModeCategory: 5,
247+
collateral: EngineFlags.DISABLED,
248+
borrowable: EngineFlags.KEEP_CURRENT
249+
});
250+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
251+
asset: USDC_ADDRESS,
252+
eModeCategory: 5,
253+
collateral: EngineFlags.KEEP_CURRENT,
254+
borrowable: EngineFlags.DISABLED
255+
});
256+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
257+
asset: RLUSD_ADDRESS,
258+
eModeCategory: 5,
259+
collateral: EngineFlags.KEEP_CURRENT,
260+
borrowable: EngineFlags.DISABLED
261+
});
262+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
263+
asset: GHO_ADDRESS,
264+
eModeCategory: 5,
265+
collateral: EngineFlags.KEEP_CURRENT,
266+
borrowable: EngineFlags.DISABLED
267+
});
268+
269+
// JTRSY Stablecoins
270+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
271+
asset: JTRSY_ADDRESS,
272+
eModeCategory: 7,
273+
collateral: EngineFlags.DISABLED,
274+
borrowable: EngineFlags.KEEP_CURRENT
275+
});
276+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
277+
asset: USDC_ADDRESS,
278+
eModeCategory: 7,
279+
collateral: EngineFlags.KEEP_CURRENT,
280+
borrowable: EngineFlags.DISABLED
281+
});
282+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
283+
asset: RLUSD_ADDRESS,
284+
eModeCategory: 7,
285+
collateral: EngineFlags.KEEP_CURRENT,
286+
borrowable: EngineFlags.DISABLED
287+
});
288+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
289+
asset: GHO_ADDRESS,
290+
eModeCategory: 7,
291+
collateral: EngineFlags.KEEP_CURRENT,
292+
borrowable: EngineFlags.DISABLED
293+
});
294+
295+
// JAAA Stablecoins
296+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
297+
asset: JAAA_ADDRESS,
298+
eModeCategory: 9,
299+
collateral: EngineFlags.DISABLED,
300+
borrowable: EngineFlags.KEEP_CURRENT
301+
});
302+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
303+
asset: USDC_ADDRESS,
304+
eModeCategory: 9,
305+
collateral: EngineFlags.KEEP_CURRENT,
306+
borrowable: EngineFlags.DISABLED
307+
});
308+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
309+
asset: RLUSD_ADDRESS,
310+
eModeCategory: 9,
311+
collateral: EngineFlags.KEEP_CURRENT,
312+
borrowable: EngineFlags.DISABLED
313+
});
314+
assetsEMode[index++] = IEngine.AssetEModeUpdate({
315+
asset: GHO_ADDRESS,
316+
eModeCategory: 9,
317+
collateral: EngineFlags.KEEP_CURRENT,
318+
borrowable: EngineFlags.DISABLED
319+
});
320+
321+
require(index == assetsEMode.length, 'length mismatch');
322+
323+
return assetsEMode;
324+
}
325+
326+
function getPoolContext() public pure override returns (IEngine.PoolContext memory) {
327+
return IEngine.PoolContext({networkName: 'Horizon RWA', networkAbbreviation: 'HorRwa'});
328+
}
329+
}

0 commit comments

Comments
 (0)