diff --git a/diffs/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_before_AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_after.md b/diffs/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_before_AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_after.md new file mode 100644 index 000000000..13ec6044f --- /dev/null +++ b/diffs/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_before_AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_after.md @@ -0,0 +1,70 @@ +## Reserve changes + +### Reserve altered + +#### GNO ([0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb](https://gnosisscan.io/address/0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 2,000,000 $ [200000000] | 0 $ [0] | + + +#### EURe ([0xcB444e90D8198415266c6a2724b7900fb12FC56E](https://gnosisscan.io/address/0xcB444e90D8198415266c6a2724b7900fb12FC56E)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 10 % [1000] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sDAI / EURe(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sDAI / EURe | +| eMode.ltv | - | 85 % | +| eMode.liquidationThreshold | - | 87.5 % | +| eMode.liquidationBonus | - | 5 % | +| eMode.borrowableBitmap | - | EURe | +| eMode.collateralBitmap | - | sDAI | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "from": null, + "to": { + "borrowableBitmap": "32", + "collateralBitmap": "64", + "eModeCategory": 2, + "label": "sDAI / EURe", + "liquidationBonus": 10500, + "liquidationThreshold": 8750, + "ltv": 8500 + } + } + }, + "reserves": { + "0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb": { + "debtCeiling": { + "from": 200000000, + "to": 0 + } + }, + "0xcB444e90D8198415266c6a2724b7900fb12FC56E": { + "reserveFactor": { + "from": 2000, + "to": 1000 + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates.md b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates.md new file mode 100644 index 000000000..50f533f44 --- /dev/null +++ b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates.md @@ -0,0 +1,49 @@ +--- +title: "Aave v3 Gnosis Instance Updates Part 1" +author: "Aave-chan Initiative" +discussions: "https://governance.aave.com/t/arfc-aave-v3-gnosis-instance-updates/20334" +snapshot: "https://snapshot.box/#/s:aave.eth/proposal/0x2e93ddd01ba5ec415b0962907b7c65def947d1ed94f1e5b402c5578560b1dddb" +--- + +## Simple Summary + +This AIP proposes several updates to the Aave v3 Gnosis instance to improve capital efficiency and add new use cases on the network. The key changes include removing GNO from isolation mode, adjusting the reserve factor for EURe, and creating a new relevant E-mode. + +## Motivation + +GNO has demonstrated strong stability and market presence on Gnosis Chain, making isolation mode unnecessarily restrictive and hindering network growth. Removing GNO from isolation mode will facilitate further expansion of the network. + +The reduction in the EURe reserve factor aligns with the asset's performance and incentivizes increased lending activity. + +introducing a new E-mode for sDAI & EURe will enhance capital efficiency and foster synergies between stable assets. The unique combination of EUR and USD borrowing opportunities is a distinct advantage for Gnosis Chain. + +## Specification + +### Rates and parameters updates + +- Remove GNO from isolation mode +- change EURe Reserve Factor from 20% to 10% + +### E-Modes + +The followings E-mode will be created: + +| **Parameter** | **Value** | **Value** | +| --------------------- | --------- | --------- | +| Asset | sDAI | EURe | +| Collateral | Yes | No | +| Borrowable | No | Yes | +| Max LTV | 85% | 85% | +| Liquidation Threshold | 87.5% | 87.5% | +| Liquidation Bonus | 5% | 5% | + +## References + +- Implementation: [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol) +- Tests: [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.t.sol) +- [Snapshot](https://snapshot.box/#/s:aave.eth/proposal/0x2e93ddd01ba5ec415b0962907b7c65def947d1ed94f1e5b402c5578560b1dddb) +- [Discussion](https://governance.aave.com/t/arfc-aave-v3-gnosis-instance-updates/20334) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates_20241224.s.sol b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates_20241224.s.sol new file mode 100644 index 000000000..9d4631866 --- /dev/null +++ b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates_20241224.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, GnosisScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224} from './AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol'; + +/** + * @dev Deploy Gnosis + * deploy-command: make deploy-ledger contract=src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates_20241224.s.sol:DeployGnosis chain=gnosis + * verify-command: FOUNDRY_PROFILE=gnosis npx catapulta-verify -b broadcast/AaveV3GnosisInstanceUpdates_20241224.s.sol/100/run-latest.json + */ +contract DeployGnosis is GnosisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates_20241224.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsGnosis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsGnosis[0] = GovV3Helpers.buildAction( + type(AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224).creationCode + ); + payloads[0] = GovV3Helpers.buildGnosisPayload(vm, actionsGnosis); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3GnosisInstanceUpdates.md' + ) + ); + } +} diff --git a/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol new file mode 100644 index 000000000..9f22a712a --- /dev/null +++ b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Gnosis, AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol'; +import {AaveV3PayloadGnosis} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadGnosis.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Aave v3 Gnosis Instance Updates + * @author Aave-chan Initiative + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0x2e93ddd01ba5ec415b0962907b7c65def947d1ed94f1e5b402c5578560b1dddb + * - Discussion: https://governance.aave.com/t/arfc-aave-v3-gnosis-instance-updates/20334 + */ +contract AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224 is AaveV3PayloadGnosis { + using SafeERC20 for IERC20; + + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3GnosisAssets.GNO_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3GnosisAssets.EURe_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 10_00 + }); + + return borrowUpdates; + } + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 2, + ltv: 85_00, + liqThreshold: 87_50, + liqBonus: 5_00, + label: 'sDAI / EURe' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](2); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3GnosisAssets.EURe_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3GnosisAssets.sDAI_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + + return assetEModeUpdates; + } +} diff --git a/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.t.sol b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.t.sol new file mode 100644 index 000000000..37dcb0b19 --- /dev/null +++ b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Gnosis} from 'aave-address-book/AaveV3Gnosis.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224} from './AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.sol'; + +/** + * @dev Test for AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224 + * command: FOUNDRY_PROFILE=gnosis forge test --match-path=src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224.t.sol -vv + */ +contract AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224_Test is ProtocolV3TestBase { + AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('gnosis'), 37810182); + proposal = new AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Gnosis_AaveV3GnosisInstanceUpdates_20241224', + AaveV3Gnosis.POOL, + address(proposal) + ); + } +} diff --git a/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/config.ts b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/config.ts new file mode 100644 index 000000000..0aa8c2e02 --- /dev/null +++ b/src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/config.ts @@ -0,0 +1,86 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: 'src/20241224_AaveV3Gnosis_AaveV3GnosisInstanceUpdates/config.ts', + force: true, + author: 'Aave-chan Initiative', + pools: ['AaveV3Gnosis'], + title: 'Aave v3 Gnosis Instance Updates', + shortName: 'AaveV3GnosisInstanceUpdates', + date: '20241224', + discussion: 'https://governance.aave.com/t/arfc-aave-v3-gnosis-instance-updates/20334', + snapshot: + 'https://snapshot.box/#/s:aave.eth/proposal/0x2e93ddd01ba5ec415b0962907b7c65def947d1ed94f1e5b402c5578560b1dddb', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Gnosis: { + configs: { + COLLATERALS_UPDATE: [ + { + asset: 'GNO', + ltv: '', + liqThreshold: '', + liqBonus: '', + debtCeiling: '0', + liqProtocolFee: '', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '10', + asset: 'EURe', + }, + ], + EMODES_UPDATES: [ + { + eModeCategory: 2, + ltv: '90', + liqThreshold: '92.5', + liqBonus: '2.5', + label: 'osGNO / GNO', + }, + {eModeCategory: 3, ltv: '85', liqThreshold: '87.5', liqBonus: '5', label: 'sDAI / EURe'}, + ], + EMODES_ASSETS: [ + {asset: 'osGNO', eModeCategory: '2', collateral: 'ENABLED', borrowable: 'DISABLED'}, + {asset: 'GNO', eModeCategory: '2', collateral: 'DISABLED', borrowable: 'ENABLED'}, + {asset: 'EURe', eModeCategory: '3', collateral: 'DISABLED', borrowable: 'ENABLED'}, + {asset: 'sDAI', eModeCategory: '3', collateral: 'ENABLED', borrowable: 'DISABLED'}, + ], + ASSET_LISTING: [ + { + assetSymbol: 'osGNO', + decimals: 18, + priceFeed: '0xbE26c8b354208E898EBd88B1576C4df2e216ed30', + ltv: '0.05', + liqThreshold: '0.1', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'DISABLED', + flashloanable: 'DISABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '4750', + borrowCap: '1', + rateStrategyParams: { + optimalUtilizationRate: '50', + baseVariableBorrowRate: '0', + variableRateSlope1: '0', + variableRateSlope2: '0', + }, + asset: '0xF490c80aAE5f2616d3e3BDa2483E30C4CB21d1A0', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 37692844}, + }, + }, +};