Skip to content

Commit 71751c8

Browse files
authored
feat: add proposal for 3.2 patch (#482)
1 parent 65f1c04 commit 71751c8

File tree

6 files changed

+420
-5
lines changed

6 files changed

+420
-5
lines changed

generator/templates/zksync.script.template.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function generateZkSyncScript(options: Options) {
1818
let template = '';
1919

2020
// generate imports
21-
template += `import {ZkSyncScript} from 'aave-helpers/src/ScriptUtils.sol';\n`;
21+
template += `import {ZkSyncScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol';\n`;
2222

2323
template += zkSyncPools
2424
.map((pool) => {
@@ -60,12 +60,9 @@ export function generateZkSyncScript(options: Options) {
6060
// generate chain scripts
6161
template += `/**
6262
* @dev Deploy ${chain}
63-
* deploy-command: make deploy-ledger contract=zksync/src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias(
63+
* deploy-command: make deploy-pk FOUNDRY_PROFILE=contract=zksync/src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias(
6464
chain,
6565
)}
66-
* verify-command: FOUNDRY_PROFILE=${getChainAlias(chain)} npx catapulta-verify -b broadcast/${fileName}.s.sol/${
67-
CHAIN_TO_CHAIN_ID[chain]
68-
}/run-latest.json
6966
*/
7067
contract Deploy${chain} is ${chain}Script {
7168
function run() external broadcast {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: "3.2 patch for legacy periphery"
3+
author: "BGD Labs @bgdlabs"
4+
discussions: "https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/45"
5+
---
6+
7+
## Simple Summary
8+
9+
Upgrade the Pool contract across all networks, to add an extra fallback on the getReserveData() view function, allowing for integrators unable to update peripheral contracts (Aave Pool Data Provider) to still be compatible with v3.2.
10+
11+
## Motivation
12+
13+
Aave v3.2 included the removal of all the logic of stable rate borrow mode, and the release of a new ProtocolDataProvider maintaining retro-compatibility.
14+
15+
However, post-release we have been contacted by integrators with totally immutable infrastructure depending on so-called “hardcoding” of legacy peripheral contracts, in this case, an old version of the ProtocolDataProvider, designed to be replaced on the core contract of Aave (PoolAddressesProvider) whenever an upgrade happens.
16+
17+
Even if non-critical, this has created issues for those integrators, and from the Aave side, it is possible to increase even more the retro-compatibility by doing a simple upgrade on the Pool smart contract.
18+
19+
## Specification
20+
21+
The governance proposal will configure a MOCK_STABLE_DEBT variable on the PoolAddressesProvider, together with upgrading the Aave Pool contract across all networks.
22+
23+
On this pool upgrade, the only modification would be to now return the previously configured MOCK_STABLE_DEBT address for stableDebtTokenAddress on Pool.getReserveData(), this way removing any type of unexpected behavior from integrators using legacy ProtocolDataProvider peripheral contracts, consuming getReserveData().
24+
25+
## Security considerations
26+
27+
The proposal was tested via unit tests and Certora [checked the upgrade and proposal](https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/46).
28+
29+
## References
30+
31+
- [Proposal Implementation](https://github.com/bgd-labs/protocol-v3.2-pdp-patch/blob/main/src/contracts/UpgradePayload.sol)
32+
- [Protocol Upgrade Implementation](https://github.com/aave-dao/aave-v3-origin/pull/64)
33+
- [Pool implementation diff](https://github.com/bgd-labs/protocol-v3.2-pdp-patch/blob/main/diffs/1_poolImpl_0x1f64488c2C4686771dafA75915274d27878B667a_0xeF434E4573b90b6ECd4a00f4888381e4D0CC5Ccd.diff)
34+
- [Tests](https://github.com/bgd-labs/protocol-v3.2-pdp-patch/tree/main/tests)
35+
- [Discussion](https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/45)
36+
- [Upgrade repository](https://github.com/bgd-labs/protocol-v3.2-pdp-patch)
37+
38+
## Copyright
39+
40+
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
Lines changed: 295 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,295 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol';
5+
import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
6+
import {GovernanceV3ZkSync} from 'aave-address-book/GovernanceV3ZkSync.sol';
7+
import {ChainIds, EthereumScript, PolygonScript, AvalancheScript, OptimismScript, ArbitrumScript, MetisScript, BaseScript, GnosisScript, ScrollScript, BNBScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol';
8+
import {Payloads} from './Payloads.sol';
9+
10+
/**
11+
* @dev Deploy Ethereum
12+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployEthereum chain=mainnet
13+
* verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/1/run-latest.json
14+
*/
15+
contract DeployEthereum is EthereumScript {
16+
function run() external broadcast {
17+
// deploy payloads
18+
address payload0 = Payloads.PROTO;
19+
address payload1 = Payloads.LIDO;
20+
address payload2 = Payloads.ETHERFI;
21+
22+
// compose action
23+
IPayloadsControllerCore.ExecutionAction[]
24+
memory actions = new IPayloadsControllerCore.ExecutionAction[](3);
25+
actions[0] = GovV3Helpers.buildAction(payload0);
26+
actions[1] = GovV3Helpers.buildAction(payload1);
27+
actions[2] = GovV3Helpers.buildAction(payload2);
28+
29+
// register action at payloadsController
30+
GovV3Helpers.createPayload(actions);
31+
}
32+
}
33+
34+
/**
35+
* @dev Deploy Polygon
36+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployPolygon chain=polygon
37+
* verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/137/run-latest.json
38+
*/
39+
contract DeployPolygon is PolygonScript {
40+
function run() external broadcast {
41+
// deploy payloads
42+
address payload0 = Payloads.POLYGON;
43+
44+
// compose action
45+
IPayloadsControllerCore.ExecutionAction[]
46+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
47+
actions[0] = GovV3Helpers.buildAction(payload0);
48+
49+
// register action at payloadsController
50+
GovV3Helpers.createPayload(actions);
51+
}
52+
}
53+
54+
/**
55+
* @dev Deploy Avalanche
56+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployAvalanche chain=avalanche
57+
* verify-command: FOUNDRY_PROFILE=avalanche npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/43114/run-latest.json
58+
*/
59+
contract DeployAvalanche is AvalancheScript {
60+
function run() external broadcast {
61+
// deploy payloads
62+
address payload0 = Payloads.AVALANCHE;
63+
64+
// compose action
65+
IPayloadsControllerCore.ExecutionAction[]
66+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
67+
actions[0] = GovV3Helpers.buildAction(payload0);
68+
69+
// register action at payloadsController
70+
GovV3Helpers.createPayload(actions);
71+
}
72+
}
73+
74+
/**
75+
* @dev Deploy Optimism
76+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployOptimism chain=optimism
77+
* verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/10/run-latest.json
78+
*/
79+
contract DeployOptimism is OptimismScript {
80+
function run() external broadcast {
81+
// deploy payloads
82+
address payload0 = Payloads.OPTIMISM;
83+
84+
// compose action
85+
IPayloadsControllerCore.ExecutionAction[]
86+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
87+
actions[0] = GovV3Helpers.buildAction(payload0);
88+
89+
// register action at payloadsController
90+
GovV3Helpers.createPayload(actions);
91+
}
92+
}
93+
94+
/**
95+
* @dev Deploy Arbitrum
96+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployArbitrum chain=arbitrum
97+
* verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/42161/run-latest.json
98+
*/
99+
contract DeployArbitrum is ArbitrumScript {
100+
function run() external broadcast {
101+
// deploy payloads
102+
address payload0 = Payloads.ARBITRUM;
103+
104+
// compose action
105+
IPayloadsControllerCore.ExecutionAction[]
106+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
107+
actions[0] = GovV3Helpers.buildAction(payload0);
108+
109+
// register action at payloadsController
110+
GovV3Helpers.createPayload(actions);
111+
}
112+
}
113+
114+
/**
115+
* @dev Deploy Metis
116+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployMetis chain=metis
117+
* verify-command: FOUNDRY_PROFILE=metis npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/1088/run-latest.json
118+
*/
119+
contract DeployMetis is MetisScript {
120+
function run() external broadcast {
121+
// deploy payloads
122+
address payload0 = Payloads.METIS;
123+
124+
// compose action
125+
IPayloadsControllerCore.ExecutionAction[]
126+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
127+
actions[0] = GovV3Helpers.buildAction(payload0);
128+
129+
// register action at payloadsController
130+
GovV3Helpers.createPayload(actions);
131+
}
132+
}
133+
134+
/**
135+
* @dev Deploy Base
136+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployBase chain=base
137+
* verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/8453/run-latest.json
138+
*/
139+
contract DeployBase is BaseScript {
140+
function run() external broadcast {
141+
// deploy payloads
142+
address payload0 = Payloads.BASE;
143+
144+
// compose action
145+
IPayloadsControllerCore.ExecutionAction[]
146+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
147+
actions[0] = GovV3Helpers.buildAction(payload0);
148+
149+
// register action at payloadsController
150+
GovV3Helpers.createPayload(actions);
151+
}
152+
}
153+
154+
/**
155+
* @dev Deploy Gnosis
156+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployGnosis chain=gnosis
157+
* verify-command: FOUNDRY_PROFILE=gnosis npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/100/run-latest.json
158+
*/
159+
contract DeployGnosis is GnosisScript {
160+
function run() external broadcast {
161+
// deploy payloads
162+
address payload0 = Payloads.GNOSIS;
163+
164+
// compose action
165+
IPayloadsControllerCore.ExecutionAction[]
166+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
167+
actions[0] = GovV3Helpers.buildAction(payload0);
168+
169+
// register action at payloadsController
170+
GovV3Helpers.createPayload(actions);
171+
}
172+
}
173+
174+
/**
175+
* @dev Deploy Scroll
176+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployScroll chain=scroll
177+
* verify-command: FOUNDRY_PROFILE=scroll npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/534352/run-latest.json
178+
*/
179+
contract DeployScroll is ScrollScript {
180+
function run() external broadcast {
181+
// deploy payloads
182+
address payload0 = Payloads.SCROLL;
183+
184+
// compose action
185+
IPayloadsControllerCore.ExecutionAction[]
186+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
187+
actions[0] = GovV3Helpers.buildAction(payload0);
188+
189+
// register action at payloadsController
190+
GovV3Helpers.createPayload(actions);
191+
}
192+
}
193+
194+
/**
195+
* @dev Deploy BNB
196+
* deploy-command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:DeployBNB chain=bnb
197+
* verify-command: FOUNDRY_PROFILE=bnb npx catapulta-verify -b broadcast/32PatchForLegacyPeriphery_20241010.s.sol/56/run-latest.json
198+
*/
199+
contract DeployBNB is BNBScript {
200+
function run() external broadcast {
201+
// deploy payloads
202+
address payload0 = Payloads.BNB;
203+
204+
// compose action
205+
IPayloadsControllerCore.ExecutionAction[]
206+
memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
207+
actions[0] = GovV3Helpers.buildAction(payload0);
208+
209+
// register action at payloadsController
210+
GovV3Helpers.createPayload(actions);
211+
}
212+
}
213+
214+
/**
215+
* @dev Create Proposal
216+
* command: make deploy-ledger contract=src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery_20241010.s.sol:CreateProposal chain=mainnet
217+
*/
218+
contract CreateProposal is EthereumScript {
219+
function run() external {
220+
// create payloads
221+
PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](11);
222+
223+
// compose actions for validation
224+
IPayloadsControllerCore.ExecutionAction[]
225+
memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](3);
226+
actionsEthereum[0] = GovV3Helpers.buildAction(Payloads.PROTO);
227+
actionsEthereum[1] = GovV3Helpers.buildAction(Payloads.LIDO);
228+
actionsEthereum[2] = GovV3Helpers.buildAction(Payloads.ETHERFI);
229+
payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
230+
231+
IPayloadsControllerCore.ExecutionAction[]
232+
memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1);
233+
actionsPolygon[0] = GovV3Helpers.buildAction(Payloads.POLYGON);
234+
payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon);
235+
236+
IPayloadsControllerCore.ExecutionAction[]
237+
memory actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1);
238+
actionsAvalanche[0] = GovV3Helpers.buildAction(Payloads.AVALANCHE);
239+
payloads[2] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche);
240+
241+
IPayloadsControllerCore.ExecutionAction[]
242+
memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1);
243+
actionsOptimism[0] = GovV3Helpers.buildAction(Payloads.OPTIMISM);
244+
payloads[3] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism);
245+
246+
IPayloadsControllerCore.ExecutionAction[]
247+
memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1);
248+
actionsArbitrum[0] = GovV3Helpers.buildAction(Payloads.ARBITRUM);
249+
payloads[4] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum);
250+
251+
IPayloadsControllerCore.ExecutionAction[]
252+
memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1);
253+
actionsMetis[0] = GovV3Helpers.buildAction(Payloads.METIS);
254+
payloads[5] = GovV3Helpers.buildMetisPayload(vm, actionsMetis);
255+
256+
IPayloadsControllerCore.ExecutionAction[]
257+
memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1);
258+
actionsBase[0] = GovV3Helpers.buildAction(Payloads.BASE);
259+
payloads[6] = GovV3Helpers.buildBasePayload(vm, actionsBase);
260+
261+
IPayloadsControllerCore.ExecutionAction[]
262+
memory actionsGnosis = new IPayloadsControllerCore.ExecutionAction[](1);
263+
actionsGnosis[0] = GovV3Helpers.buildAction(Payloads.GNOSIS);
264+
payloads[7] = GovV3Helpers.buildGnosisPayload(vm, actionsGnosis);
265+
266+
IPayloadsControllerCore.ExecutionAction[]
267+
memory actionsScroll = new IPayloadsControllerCore.ExecutionAction[](1);
268+
actionsScroll[0] = GovV3Helpers.buildAction(Payloads.SCROLL);
269+
payloads[8] = GovV3Helpers.buildScrollPayload(vm, actionsScroll);
270+
271+
IPayloadsControllerCore.ExecutionAction[]
272+
memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1);
273+
actionsBNB[0] = GovV3Helpers.buildAction(Payloads.BNB);
274+
payloads[9] = GovV3Helpers.buildBNBPayload(vm, actionsBNB);
275+
276+
payloads[10] = PayloadsControllerUtils.Payload({
277+
chain: ChainIds.ZKSYNC,
278+
accessLevel: PayloadsControllerUtils.AccessControl.Level_1,
279+
payloadsController: address(GovernanceV3ZkSync.PAYLOADS_CONTROLLER),
280+
payloadId: 7
281+
});
282+
283+
// create proposal
284+
vm.startBroadcast();
285+
GovV3Helpers.createProposal(
286+
vm,
287+
payloads,
288+
GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL,
289+
GovV3Helpers.ipfsHashFile(
290+
vm,
291+
'src/20241010_Multi_32PatchForLegacyPeriphery/32PatchForLegacyPeriphery.md'
292+
)
293+
);
294+
}
295+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.0;
3+
4+
library Payloads {
5+
address internal constant POLYGON = address(0x2Efe215aE82339fa059bb9d611E4cC858cfe9Df6);
6+
address internal constant GNOSIS = address(0xD410270dadBA6CAB0b3523136b79ab3a19CCecc8);
7+
address internal constant OPTIMISM = address(0xAdDb96Fb6A795faf042DD25BD4710267C41D1F74);
8+
address internal constant ARBITRUM = address(0xF5eA8A01d4e0456B605dC0f1EC4E401a8cA6397A);
9+
address internal constant AVALANCHE = address(0xA434D495249abE33E031Fe71a969B81f3c07950D);
10+
address internal constant BASE = address(0x29081f7aB5a644716EfcDC10D5c926c5fEe9F72B);
11+
address internal constant SCROLL = address(0x82dcCF206Ae2Ab46E2099e663F70DeE77caE7778);
12+
address internal constant BNB = address(0x3cd1dFB81C50A5300C60a181ED145a7286d81e0a);
13+
address internal constant PROTO = address(0x55c09b4Df32606667dBdF7dc846417bFb4Cec776);
14+
address internal constant ZKSYNC = address(0x449e788367f32a6E19C54557A4D36FA8bc4C2eB4);
15+
address internal constant METIS = address(0x61637B1EF7e9A102e50B661D3d7dbe19ef93347e);
16+
address internal constant LIDO = address(0xF4AbB0d80C1E5D4Be3dCd38a864AD5D8bFDe0ac3);
17+
address internal constant ETHERFI = address(0x56496FA0C8AB691dAe9632320963862108775ab2);
18+
}

0 commit comments

Comments
 (0)