diff --git a/foundry.toml b/foundry.toml index 13228d1..7ff60bc 100644 --- a/foundry.toml +++ b/foundry.toml @@ -62,4 +62,5 @@ scroll = { key = "${ETHERSCAN_API_KEY_SCROLL}", chainId = 534352 } zksync = { key = "${ETHERSCAN_API_KEY_ZKSYNC}", chain = 324 } [fmt] -tab_width = 2 \ No newline at end of file +tab_width = 2 +quote_style = 'single' \ No newline at end of file diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol index 08b2399..37bcb73 100644 --- a/script/Deploy.s.sol +++ b/script/Deploy.s.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {MiscEthereum} from "aave-address-book/MiscEthereum.sol"; -import {AaveV3Ethereum} from "aave-address-book/AaveV3Ethereum.sol"; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; -import {MiscPolygon} from "aave-address-book/MiscPolygon.sol"; -import {AaveV3Polygon} from "aave-address-book/AaveV3Polygon.sol"; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; -import {GovV3Helpers} from "aave-helpers/src/GovV3Helpers.sol"; -import {CollectorWithCustomImpl} from "../src/CollectorWithCustomImpl.sol"; -import {UpgradePayload} from "../src/UpgradePayload.sol"; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {CollectorWithCustomImpl} from '../src/CollectorWithCustomImpl.sol'; +import {UpgradePayload} from '../src/UpgradePayload.sol'; library DeploymentLibrary { function _deploy(address aclManager, address collector, address proxyAdmin) private returns (address) { diff --git a/src/CollectorWithCustomImpl.sol b/src/CollectorWithCustomImpl.sol index 2ce6a4d..f9c6b4c 100644 --- a/src/CollectorWithCustomImpl.sol +++ b/src/CollectorWithCustomImpl.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Collector, ICollector} from "aave-v3-origin/contracts/treasury/Collector.sol"; +import {Collector, ICollector} from 'aave-v3-origin/contracts/treasury/Collector.sol'; /** * @title Collector diff --git a/src/CollectorWithCustomImplZkSync.sol b/src/CollectorWithCustomImplZkSync.sol index f80fe9b..a883828 100644 --- a/src/CollectorWithCustomImplZkSync.sol +++ b/src/CollectorWithCustomImplZkSync.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {Collector, ICollector} from "aave-v3-origin/contracts/treasury/Collector.sol"; +import {Collector, ICollector} from 'aave-v3-origin/contracts/treasury/Collector.sol'; /** * @title Collector diff --git a/src/UpgradePayload.sol b/src/UpgradePayload.sol index 109396d..80d4262 100644 --- a/src/UpgradePayload.sol +++ b/src/UpgradePayload.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.0; import { ITransparentUpgradeableProxy, ProxyAdmin -} from "solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol"; -import {IAccessControl} from "aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol"; -import {ICollector} from "aave-v3-origin/contracts/treasury/ICollector.sol"; +} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {IAccessControl} from 'aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {ICollector} from 'aave-v3-origin/contracts/treasury/ICollector.sol'; contract UpgradePayload { address public immutable PROXY_ADMIN; diff --git a/test/Mainnet.t.sol b/test/Mainnet.t.sol index 4bc5b3e..6cddaf2 100644 --- a/test/Mainnet.t.sol +++ b/test/Mainnet.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {AaveV3Ethereum, IPool} from "aave-address-book/AaveV3Ethereum.sol"; -import {UpgradeTest} from "./UpgradeTest.sol"; -import {DeploymentLibrary} from "../script/Deploy.s.sol"; +import {AaveV3Ethereum, IPool} from 'aave-address-book/AaveV3Ethereum.sol'; +import {UpgradeTest} from './UpgradeTest.sol'; +import {DeploymentLibrary} from '../script/Deploy.s.sol'; contract MainnetTest is UpgradeTest { - constructor() UpgradeTest("mainnet", 21336615) {} + constructor() UpgradeTest('mainnet', 21336615) {} function _getPayload() internal virtual override returns (address) { return DeploymentLibrary.deployMainnet(); diff --git a/test/Polygon.t.sol b/test/Polygon.t.sol index 1eaf518..89ae16e 100644 --- a/test/Polygon.t.sol +++ b/test/Polygon.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {AaveV3Polygon, IPool} from "aave-address-book/AaveV3Polygon.sol"; -import {UpgradeTest} from "./UpgradeTest.sol"; -import {DeploymentLibrary} from "../script/Deploy.s.sol"; +import {AaveV3Polygon, IPool} from 'aave-address-book/AaveV3Polygon.sol'; +import {UpgradeTest} from './UpgradeTest.sol'; +import {DeploymentLibrary} from '../script/Deploy.s.sol'; contract PolygonTest is UpgradeTest { - constructor() UpgradeTest("polygon", 65118236) {} + constructor() UpgradeTest('polygon', 65118236) {} function _getPayload() internal virtual override returns (address) { return DeploymentLibrary.deployPolygon(); diff --git a/test/UpgradeTest.sol b/test/UpgradeTest.sol index edff1f1..beeb335 100644 --- a/test/UpgradeTest.sol +++ b/test/UpgradeTest.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ProtocolV3TestBase, IPool, IPoolAddressesProvider} from "aave-helpers/src/ProtocolV3TestBase.sol"; -import {Collector, ICollector, IERC20} from "aave-v3-origin/contracts/treasury/Collector.sol"; -import {IAccessControl} from "aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol"; -import {UpgradePayload} from "../src/UpgradePayload.sol"; +import {ProtocolV3TestBase, IPool, IPoolAddressesProvider} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {Collector, ICollector, IERC20} from 'aave-v3-origin/contracts/treasury/Collector.sol'; +import {IAccessControl} from 'aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {UpgradePayload} from '../src/UpgradePayload.sol'; /** * @dev Test for AaveV3EthereumLido_GHOListingOnLidoPool_20241119 diff --git a/zksync/test/ZkSync.t.sol b/zksync/test/ZkSync.t.sol new file mode 100644 index 0000000..3fbb7e4 --- /dev/null +++ b/zksync/test/ZkSync.t.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ProtocolV3TestBase, IPool, IPoolAddressesProvider} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {Collector, ICollector, IERC20} from "aave-v3-origin/contracts/treasury/Collector.sol"; +import {IAccessControl} from "aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol"; +import {UpgradePayload} from "../src/UpgradePayload.sol"; + +/** + * @dev Test for AaveV3EthereumLido_GHOListingOnLidoPool_20241119 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241119_AaveV3EthereumLido_GHOListingOnLidoPool/AaveV3EthereumLido_GHOListingOnLidoPool_20241119.t.sol -vv + */ +abstract contract UpgradeTest is ProtocolV3TestBase { + string public NETWORK; + uint256 public immutable BLOCK_NUMBER; + + address payload; + + constructor(string memory network, uint256 blocknumber) { + NETWORK = network; + BLOCK_NUMBER = blocknumber; + } + + function setUp() public { + vm.createSelectFork(vm.rpcUrl(NETWORK), BLOCK_NUMBER); + payload = _getPayload(); + } + + function test_defaultExecution() external { + defaultTest(NETWORK, _getPool(), payload); + } + + // ensures stream id is in same position as before + function test_storageCorrectness() external { + Collector collector = Collector(UpgradePayload(payload).COLLECTOR()); + uint256 nextStreamIdBefore = collector.getNextStreamId(); + + executePayload(vm, payload); + + assertEq(nextStreamIdBefore, collector.getNextStreamId()); + // revision should be 6 + assertEq(uint256(vm.load(address(collector), bytes32(uint256(0)))), 6); + // initializing should be false + assertEq(vm.load(address(collector), bytes32(uint256(1))), 0x0); + // last slot of gap should be empty + assertEq(vm.load(address(collector), bytes32(uint256(51))), 0x0); + // reentrancy _status should be 1 + assertEq(uint256(vm.load(address(collector), bytes32(uint256(52)))), 1); + } + + function test_transfer_aclAdmin() external { + executePayload(vm, payload); + + IPoolAddressesProvider provider = _getPool().ADDRESSES_PROVIDER(); + address aclAdmin = provider.getACLAdmin(); + Collector collector = Collector(UpgradePayload(payload).COLLECTOR()); + + vm.startPrank(aclAdmin); + deal(address(collector), 100 ether); + collector.transfer(IERC20(collector.ETH_MOCK_ADDRESS()), address(this), 100 ether); + } + + // ensures reentracy is not borked + function test_transfer_newAdmin() external { + executePayload(vm, payload); + + IPoolAddressesProvider provider = _getPool().ADDRESSES_PROVIDER(); + address aclAdmin = provider.getACLAdmin(); + address aclManager = provider.getACLManager(); + Collector collector = Collector(UpgradePayload(payload).COLLECTOR()); + + vm.startPrank(aclAdmin); + IAccessControl(aclManager).grantRole(collector.FUNDS_ADMIN_ROLE(), address(this)); + vm.stopPrank(); + + deal(address(collector), 100 ether); + collector.transfer(IERC20(collector.ETH_MOCK_ADDRESS()), address(this), 100 ether); + } + + function _getPayload() internal virtual returns (address); + + function _getPool() internal virtual returns (IPool); + + receive() external payable {} +}