PulseSchedulerGovernance.t.sol 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // SPDX-License-Identifier: Apache 2
  2. pragma solidity ^0.8.0;
  3. import "forge-std/Test.sol";
  4. import "forge-std/console.sol";
  5. import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
  6. import "../contracts/pulse/SchedulerUpgradeable.sol";
  7. import "../contracts/pulse/SchedulerErrors.sol";
  8. contract SchedulerInvalidMagic is SchedulerUpgradeable {
  9. function schedulerUpgradableMagic() public pure override returns (uint32) {
  10. return 0x12345678; // Incorrect magic
  11. }
  12. }
  13. contract PulseSchedulerGovernanceTest is Test {
  14. ERC1967Proxy public proxy;
  15. SchedulerUpgradeable public scheduler;
  16. SchedulerUpgradeable public scheduler2;
  17. SchedulerInvalidMagic public schedulerInvalidMagic;
  18. address public owner = address(1);
  19. address public admin = address(2);
  20. address public admin2 = address(3);
  21. address public pyth = address(4);
  22. function setUp() public {
  23. SchedulerUpgradeable _scheduler = new SchedulerUpgradeable();
  24. // Deploy proxy contract and point it to implementation
  25. proxy = new ERC1967Proxy(address(_scheduler), "");
  26. // Wrap in ABI to support easier calls
  27. scheduler = SchedulerUpgradeable(address(proxy));
  28. // For testing upgrades
  29. scheduler2 = new SchedulerUpgradeable();
  30. schedulerInvalidMagic = new SchedulerInvalidMagic();
  31. uint128 minBalancePerFeed = 10 ** 16; // 0.01 ether
  32. uint128 keeperFee = 10 ** 15; // 0.001 ether
  33. scheduler.initialize(owner, admin, pyth, minBalancePerFeed, keeperFee);
  34. }
  35. function testGetAdmin() public {
  36. assertEq(scheduler.getAdmin(), admin);
  37. }
  38. function testProposeAdminByOwner() public {
  39. vm.prank(owner);
  40. scheduler.proposeAdmin(admin2);
  41. assertEq(scheduler.proposedAdmin(), admin2);
  42. }
  43. function testProposeAdminByAdmin() public {
  44. vm.prank(admin);
  45. scheduler.proposeAdmin(admin2);
  46. assertEq(scheduler.proposedAdmin(), admin2);
  47. }
  48. function testProposeAdminByUnauthorized() public {
  49. address unauthorized = address(5);
  50. vm.prank(unauthorized);
  51. vm.expectRevert(Unauthorized.selector);
  52. scheduler.proposeAdmin(admin2);
  53. }
  54. function testAcceptAdminByProposed() public {
  55. vm.prank(owner);
  56. scheduler.proposeAdmin(admin2);
  57. vm.prank(admin2);
  58. scheduler.acceptAdmin();
  59. assertEq(scheduler.getAdmin(), admin2);
  60. assertEq(scheduler.proposedAdmin(), address(0));
  61. }
  62. function testAcceptAdminByUnauthorized() public {
  63. vm.prank(owner);
  64. scheduler.proposeAdmin(admin2);
  65. address unauthorized = address(5);
  66. vm.prank(unauthorized);
  67. vm.expectRevert(Unauthorized.selector);
  68. scheduler.acceptAdmin();
  69. }
  70. function testUpgradeByOwner() public {
  71. vm.prank(owner);
  72. scheduler.upgradeTo(address(scheduler2));
  73. // Verify contract works
  74. assertEq(scheduler.getAdmin(), admin);
  75. }
  76. function testUpgradeByAdmin() public {
  77. vm.prank(admin);
  78. vm.expectRevert("Ownable: caller is not the owner");
  79. scheduler.upgradeTo(address(scheduler2));
  80. }
  81. function testUpgradeInvalidMagic() public {
  82. vm.prank(owner);
  83. vm.expectRevert("Invalid upgrade magic");
  84. scheduler.upgradeTo(address(schedulerInvalidMagic));
  85. }
  86. function testProposeZeroAddressAdmin() public {
  87. vm.prank(owner);
  88. vm.expectRevert("newAdmin is zero address");
  89. scheduler.proposeAdmin(address(0));
  90. }
  91. function testProposeThenChangeProposedAdmin() public {
  92. vm.prank(owner);
  93. scheduler.proposeAdmin(admin2);
  94. assertEq(scheduler.proposedAdmin(), admin2);
  95. address admin3 = address(6);
  96. vm.prank(admin);
  97. scheduler.proposeAdmin(admin3);
  98. assertEq(scheduler.proposedAdmin(), admin3);
  99. }
  100. }