PulseSchedulerGovernance.t.sol 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 "@pythnetwork/pulse-sdk-solidity/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. uint128 minBalancePerFeed = 10 ** 16; // 0.01 ether
  25. uint128 keeperFee = 10 ** 15; // 0.001 ether
  26. // Deploy proxy contract and point it to implementation
  27. proxy = new ERC1967Proxy(
  28. address(_scheduler),
  29. abi.encodeWithSelector(
  30. SchedulerUpgradeable.initialize.selector,
  31. owner,
  32. admin,
  33. pyth,
  34. minBalancePerFeed,
  35. keeperFee
  36. )
  37. );
  38. // Wrap in ABI to support easier calls
  39. scheduler = SchedulerUpgradeable(address(proxy));
  40. // For testing upgrades
  41. scheduler2 = new SchedulerUpgradeable();
  42. schedulerInvalidMagic = new SchedulerInvalidMagic();
  43. }
  44. function testGetAdmin() public {
  45. assertEq(scheduler.getAdmin(), admin);
  46. }
  47. function testProposeAdminByOwner() public {
  48. vm.prank(owner);
  49. scheduler.proposeAdmin(admin2);
  50. assertEq(scheduler.proposedAdmin(), admin2);
  51. }
  52. function testProposeAdminByAdmin() public {
  53. vm.prank(admin);
  54. scheduler.proposeAdmin(admin2);
  55. assertEq(scheduler.proposedAdmin(), admin2);
  56. }
  57. function testProposeAdminByUnauthorized() public {
  58. address unauthorized = address(5);
  59. vm.prank(unauthorized);
  60. vm.expectRevert(
  61. abi.encodeWithSelector(SchedulerErrors.Unauthorized.selector)
  62. );
  63. scheduler.proposeAdmin(admin2);
  64. }
  65. function testAcceptAdminByProposed() public {
  66. vm.prank(owner);
  67. scheduler.proposeAdmin(admin2);
  68. vm.prank(admin2);
  69. scheduler.acceptAdmin();
  70. assertEq(scheduler.getAdmin(), admin2);
  71. assertEq(scheduler.proposedAdmin(), address(0));
  72. }
  73. function testAcceptAdminByUnauthorized() public {
  74. vm.prank(owner);
  75. scheduler.proposeAdmin(admin2);
  76. address unauthorized = address(5);
  77. vm.prank(unauthorized);
  78. vm.expectRevert(
  79. abi.encodeWithSelector(SchedulerErrors.Unauthorized.selector)
  80. );
  81. scheduler.acceptAdmin();
  82. }
  83. function testUpgradeByOwner() public {
  84. vm.prank(owner);
  85. scheduler.upgradeTo(address(scheduler2));
  86. // Verify contract works
  87. assertEq(scheduler.getAdmin(), admin);
  88. }
  89. function testUpgradeByAdmin() public {
  90. vm.prank(admin);
  91. vm.expectRevert("Ownable: caller is not the owner");
  92. scheduler.upgradeTo(address(scheduler2));
  93. }
  94. function testUpgradeInvalidMagic() public {
  95. vm.prank(owner);
  96. vm.expectRevert("Invalid upgrade magic");
  97. scheduler.upgradeTo(address(schedulerInvalidMagic));
  98. }
  99. function testProposeZeroAddressAdmin() public {
  100. vm.prank(owner);
  101. vm.expectRevert("newAdmin is zero address");
  102. scheduler.proposeAdmin(address(0));
  103. }
  104. function testProposeThenChangeProposedAdmin() public {
  105. vm.prank(owner);
  106. scheduler.proposeAdmin(admin2);
  107. assertEq(scheduler.proposedAdmin(), admin2);
  108. address admin3 = address(6);
  109. vm.prank(admin);
  110. scheduler.proposeAdmin(admin3);
  111. assertEq(scheduler.proposedAdmin(), admin3);
  112. }
  113. }