From db50cb80154817def04468c5259936cde2fe4a24 Mon Sep 17 00:00:00 2001 From: Simon Dosch Date: Wed, 26 Jun 2024 18:12:12 +0200 Subject: [PATCH 1/3] send pol directly to StakeManager, update script 1.3.0 --- src/DefaultEmissionManager.sol | 7 +- test/DefaultEmissionManager.t.sol | 14 ++-- ...DefaultEmissionManager.1.2.0.sepolia.t.sol | 79 ------------------- ...efaultEmissionManager.1.3.0.mainnet.t.sol} | 31 +------- 4 files changed, 15 insertions(+), 116 deletions(-) delete mode 100644 test/upgrade/DefaultEmissionManager.1.2.0.sepolia.t.sol rename test/upgrade/{DefaultEmissionManager.1.2.0.mainnet.t.sol => DefaultEmissionManager.1.3.0.mainnet.t.sol} (62%) diff --git a/src/DefaultEmissionManager.sol b/src/DefaultEmissionManager.sol index de18ff2..ab80113 100644 --- a/src/DefaultEmissionManager.sol +++ b/src/DefaultEmissionManager.sol @@ -78,9 +78,10 @@ contract DefaultEmissionManager is Ownable2StepUpgradeable, IDefaultEmissionMana IPolygonEcosystemToken _token = token; _token.mint(address(this), amountToMint); + _token.safeTransfer(treasury, treasuryAmt); - // backconvert POL to MATIC before sending to StakeManager - migration.unmigrateTo(stakeManager, stakeManagerAmt); + + _token.safeTransfer(stakeManager, stakeManagerAmt); } /// @inheritdoc IDefaultEmissionManager @@ -91,7 +92,7 @@ contract DefaultEmissionManager is Ownable2StepUpgradeable, IDefaultEmissionMana /// @inheritdoc IDefaultEmissionManager function version() external pure returns (string memory) { - return "1.2.0"; + return "1.3.0"; } uint256[47] private __gap; diff --git a/test/DefaultEmissionManager.t.sol b/test/DefaultEmissionManager.t.sol index 7a5fd59..2ec1d44 100644 --- a/test/DefaultEmissionManager.t.sol +++ b/test/DefaultEmissionManager.t.sol @@ -147,7 +147,7 @@ contract DefaultEmissionManagerTest is Test { assertApproxEqAbs(newSupply, polygon.totalSupply(), _MAX_PRECISION_DELTA); uint256 totalAmtMinted = polygon.totalSupply() - initialTotalSupply; uint256 totalAmtMintedTwoFifth = totalAmtMinted * 2 / 5; - assertEq(matic.balanceOf(stakeManager), totalAmtMinted - totalAmtMintedTwoFifth); + assertEq(polygon.balanceOf(stakeManager), totalAmtMinted - totalAmtMintedTwoFifth); assertEq(polygon.balanceOf(treasury), totalAmtMintedTwoFifth); } @@ -167,8 +167,8 @@ contract DefaultEmissionManagerTest is Test { assertApproxEqAbs(newSupply, polygon.totalSupply(), _MAX_PRECISION_DELTA); uint256 balance = (polygon.totalSupply() - initialTotalSupply) * 2 / 5; uint256 stakeManagerBalance = (polygon.totalSupply() - initialTotalSupply) - balance; - assertEq(matic.balanceOf(stakeManager), stakeManagerBalance); - assertEq(polygon.balanceOf(stakeManager), 0); + assertEq(polygon.balanceOf(stakeManager), stakeManagerBalance); + assertEq(matic.balanceOf(stakeManager), 0); assertEq(polygon.balanceOf(treasury), balance); skip(delay); @@ -185,8 +185,8 @@ contract DefaultEmissionManagerTest is Test { balance = totalAmtMintedTwoFifth; stakeManagerBalance = totalAmtMinted - totalAmtMintedTwoFifth; - assertEq(matic.balanceOf(stakeManager), stakeManagerBalance); - assertEq(polygon.balanceOf(stakeManager), 0); + assertEq(polygon.balanceOf(stakeManager), stakeManagerBalance); + assertEq(matic.balanceOf(stakeManager), 0); assertEq(polygon.balanceOf(treasury), balance); } @@ -213,8 +213,8 @@ contract DefaultEmissionManagerTest is Test { balance = totalAmtMintedTwoFifth; stakeManagerBalance = totalAmtMinted - totalAmtMintedTwoFifth; - assertEq(matic.balanceOf(stakeManager), stakeManagerBalance); - assertEq(polygon.balanceOf(stakeManager), 0); + assertEq(polygon.balanceOf(stakeManager), stakeManagerBalance); + assertEq(matic.balanceOf(stakeManager), 0); assertEq(polygon.balanceOf(treasury), balance); } } diff --git a/test/upgrade/DefaultEmissionManager.1.2.0.sepolia.t.sol b/test/upgrade/DefaultEmissionManager.1.2.0.sepolia.t.sol deleted file mode 100644 index dc4fbde..0000000 --- a/test/upgrade/DefaultEmissionManager.1.2.0.sepolia.t.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.21; - -import {PolygonEcosystemToken} from "src/PolygonEcosystemToken.sol"; -import {DefaultEmissionManager} from "src/DefaultEmissionManager.sol"; -import {PolygonMigration} from "src/PolygonMigration.sol"; -import {ERC20PresetMinterPauser} from "openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; -import { - ProxyAdmin, - TransparentUpgradeableProxy, - ITransparentUpgradeableProxy -} from "openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; -import {Test} from "forge-std/Test.sol"; - -// this test forks mainnet and tests the upgradeability of DefaultEmissionManagerProxy - -contract DefaultEmissionManagerTestSepolia is Test { - uint256 fork; - - address POLYGON_PROTOCOL_COUNCIL = 0xeE76bECaF80fFe451c8B8AFEec0c21518Def02f9; - address EM_PROXY = 0x20393fF3B3C38b72a16eB7d7A474cd38ABD8Ff27; - address COMMUNITY_TREASURY = 0xeE76bECaF80fFe451c8B8AFEec0c21518Def02f9; - address EM_PROXY_ADMIN = 0x28cDCE6FfE44D03da1F7b15b474a0e72243873F2; - PolygonEcosystemToken pol = PolygonEcosystemToken(0x44499312f493F62f2DFd3C6435Ca3603EbFCeeBa); - - uint256 NEW_INTEREST_PER_YEAR_LOG2 = 0.03562390973072122e18; // log2(1.025) - - string[] internal inputs = new string[](5); - - function setUp() public { - fork = vm.createFork(vm.rpcUrl("testnet")); - } - - function testUpgrade() external { - vm.selectFork(fork); - - address newTreasury = makeAddr("newTreasury"); - - DefaultEmissionManager emProxy = DefaultEmissionManager(EM_PROXY); - - assertEq(emProxy.treasury(), COMMUNITY_TREASURY); - - address migration = address(emProxy.migration()); - address stakeManager = emProxy.stakeManager(); - - DefaultEmissionManager newEmImpl = new DefaultEmissionManager(migration, stakeManager, newTreasury); - - ProxyAdmin admin = ProxyAdmin(EM_PROXY_ADMIN); - - vm.prank(POLYGON_PROTOCOL_COUNCIL); - - admin.upgradeAndCall( - ITransparentUpgradeableProxy(address(emProxy)), - address(newEmImpl), - abi.encodeWithSelector(DefaultEmissionManager.reinitialize.selector) - ); - - // initialize can still not be called - vm.expectRevert("Initializable: contract is already initialized"); - emProxy.initialize(makeAddr("token"), msg.sender); - - assertEq(pol.totalSupply(), emProxy.START_SUPPLY_1_2_0()); - assertEq(block.timestamp, emProxy.startTimestamp()); - - // emission is now 2.5% - inputs[0] = "node"; - inputs[1] = "test/util/calc.js"; - inputs[2] = vm.toString(uint256(365 days)); - inputs[3] = vm.toString(pol.totalSupply()); - // vm.ffi executes the js script which contains the new emission rate - uint256 newSupply = abi.decode(vm.ffi(inputs), (uint256)); - assertApproxEqAbs(newSupply, emProxy.inflatedSupplyAfter(365 days), 1e20); - - // treasury has been updated - assertEq(emProxy.treasury(), newTreasury); - // emission has been updated - assertEq(emProxy.INTEREST_PER_YEAR_LOG2(), NEW_INTEREST_PER_YEAR_LOG2); - } -} diff --git a/test/upgrade/DefaultEmissionManager.1.2.0.mainnet.t.sol b/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol similarity index 62% rename from test/upgrade/DefaultEmissionManager.1.2.0.mainnet.t.sol rename to test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol index 4ad5c51..f9c2fa3 100644 --- a/test/upgrade/DefaultEmissionManager.1.2.0.mainnet.t.sol +++ b/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol @@ -34,46 +34,23 @@ contract DefaultEmissionManagerTestMainnet is Test { function testUpgrade() external { vm.selectFork(mainnetFork); - address newTreasury = makeAddr("newTreasury"); - DefaultEmissionManager emProxy = DefaultEmissionManager(EM_PROXY); assertEq(emProxy.treasury(), COMMUNITY_TREASURY); address migration = address(emProxy.migration()); address stakeManager = emProxy.stakeManager(); + address treasury = emProxy.treasury(); - DefaultEmissionManager newEmImpl = new DefaultEmissionManager(migration, stakeManager, newTreasury); + DefaultEmissionManager newEmImpl = new DefaultEmissionManager(migration, stakeManager, treasury); ProxyAdmin admin = ProxyAdmin(EM_PROXY_ADMIN); vm.prank(POLYGON_PROTOCOL_COUNCIL); - admin.upgradeAndCall( + admin.upgrade( ITransparentUpgradeableProxy(address(emProxy)), - address(newEmImpl), - abi.encodeWithSelector(DefaultEmissionManager.reinitialize.selector) + address(newEmImpl) ); - - // initialize can still not be called - vm.expectRevert("Initializable: contract is already initialized"); - emProxy.initialize(makeAddr("token"), msg.sender); - - assertEq(pol.totalSupply(), emProxy.START_SUPPLY_1_2_0()); - assertEq(block.timestamp, emProxy.startTimestamp()); - - // emission is now 2.5% - inputs[0] = "node"; - inputs[1] = "test/util/calc.js"; - inputs[2] = vm.toString(uint256(365 days)); - inputs[3] = vm.toString(pol.totalSupply()); - // vm.ffi executes the js script which contains the new emission rate - uint256 newSupply = abi.decode(vm.ffi(inputs), (uint256)); - assertApproxEqAbs(newSupply, emProxy.inflatedSupplyAfter(365 days), 1e20); - - // treasury has been updated - assertEq(emProxy.treasury(), newTreasury); - // emission has been updated - assertEq(emProxy.INTEREST_PER_YEAR_LOG2(), NEW_INTEREST_PER_YEAR_LOG2); } } From 0aadab113fca77f52eed054655a56b2297441f49 Mon Sep 17 00:00:00 2001 From: Simon Dosch Date: Mon, 15 Jul 2024 11:06:25 +0200 Subject: [PATCH 2/3] add 1.3.0 deployment script --- script/1.3.0/UpgradeEmissionManager.s.sol | 45 +++++++++++++++++++++++ script/1.3.0/input.json | 10 +++++ 2 files changed, 55 insertions(+) create mode 100644 script/1.3.0/UpgradeEmissionManager.s.sol create mode 100644 script/1.3.0/input.json diff --git a/script/1.3.0/UpgradeEmissionManager.s.sol b/script/1.3.0/UpgradeEmissionManager.s.sol new file mode 100644 index 0000000..34846d4 --- /dev/null +++ b/script/1.3.0/UpgradeEmissionManager.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import {Script, stdJson, console2 as console} from "forge-std/Script.sol"; + +import { + ProxyAdmin, + TransparentUpgradeableProxy, + ITransparentUpgradeableProxy +} from "openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol"; +import {DefaultEmissionManager} from "../../src/DefaultEmissionManager.sol"; + +contract UpgradeEmissionManager is Script { + using stdJson for string; + + function run() public { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + + string memory input = vm.readFile("script/1.2.0/input.json"); + string memory chainIdSlug = string(abi.encodePacked('["', vm.toString(block.chainid), '"]')); + address emProxyAddress = input.readAddress(string.concat(chainIdSlug, ".emissionManagerProxy")); + address emProxyAdmin = input.readAddress(string.concat(chainIdSlug, ".emProxyAdmin")); + + vm.startBroadcast(deployerPrivateKey); + + DefaultEmissionManager emProxy = DefaultEmissionManager(emProxyAddress); + + address migration = address(emProxy.migration()); + address stakeManager = emProxy.stakeManager(); + address treasury = emProxy.treasury(); + + DefaultEmissionManager newEmImpl = new DefaultEmissionManager(migration, stakeManager, treasury); + + vm.stopBroadcast(); + + bytes memory payload = abi.encodeWithSelector( + ProxyAdmin.upgrade.selector, + ITransparentUpgradeableProxy(address(emProxy)), + address(newEmImpl) + ); + + console.log("Send this payload to: ", emProxyAdmin); + console.logBytes(payload); + } +} diff --git a/script/1.3.0/input.json b/script/1.3.0/input.json new file mode 100644 index 0000000..06cd42f --- /dev/null +++ b/script/1.3.0/input.json @@ -0,0 +1,10 @@ +{ + "1": { + "emissionManagerProxy": "0xbC9f74b3b14f460a6c47dCdDFd17411cBc7b6c53", + "emProxyAdmin": "0xEBea33f2c92D03556b417F4F572B2FbbE62C39c3" + }, + "11155111": { + "emissionManagerProxy": "0x20393fF3B3C38b72a16eB7d7A474cd38ABD8Ff27", + "emProxyAdmin": "0x28cDCE6FfE44D03da1F7b15b474a0e72243873F2" + } +} From b3d6f4f8fbfd3e20711e62a09a075f5f4e5c0218 Mon Sep 17 00:00:00 2001 From: Simon Dosch Date: Tue, 23 Jul 2024 12:07:42 +0200 Subject: [PATCH 3/3] fix: update treasury address --- test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol b/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol index f9c2fa3..ae4c156 100644 --- a/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol +++ b/test/upgrade/DefaultEmissionManager.1.3.0.mainnet.t.sol @@ -19,7 +19,7 @@ contract DefaultEmissionManagerTestMainnet is Test { address POLYGON_PROTOCOL_COUNCIL = 0x37D085ca4a24f6b29214204E8A8666f12cf19516; address EM_PROXY = 0xbC9f74b3b14f460a6c47dCdDFd17411cBc7b6c53; - address COMMUNITY_TREASURY = 0x2ff25495d77f380d5F65B95F103181aE8b1cf898; + address COMMUNITY_TREASURY = 0x86380e136A3AaD5677A210Ad02713694c4E6a5b9; address EM_PROXY_ADMIN = 0xEBea33f2c92D03556b417F4F572B2FbbE62C39c3; PolygonEcosystemToken pol = PolygonEcosystemToken(0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6);