ReceiverGovernanceStructs.sol 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // contracts/GovernanceStructs.sol
  2. // SPDX-License-Identifier: Apache 2
  3. pragma solidity ^0.8.0;
  4. import "../libraries/external/BytesLib.sol";
  5. import "./ReceiverStructs.sol";
  6. contract ReceiverGovernanceStructs {
  7. using BytesLib for bytes;
  8. enum GovernanceAction {
  9. UpgradeContract,
  10. UpgradeGuardianset
  11. }
  12. struct GuardianSetUpgrade {
  13. bytes32 module;
  14. uint8 action;
  15. uint16 chain;
  16. ReceiverStructs.GuardianSet newGuardianSet;
  17. uint32 newGuardianSetIndex;
  18. }
  19. function parseGuardianSetUpgrade(
  20. bytes memory encodedUpgrade
  21. ) public pure returns (GuardianSetUpgrade memory gsu) {
  22. uint index = 0;
  23. gsu.module = encodedUpgrade.toBytes32(index);
  24. index += 32;
  25. gsu.action = encodedUpgrade.toUint8(index);
  26. index += 1;
  27. require(gsu.action == 2, "invalid GuardianSetUpgrade");
  28. gsu.chain = encodedUpgrade.toUint16(index);
  29. index += 2;
  30. gsu.newGuardianSetIndex = encodedUpgrade.toUint32(index);
  31. index += 4;
  32. uint8 guardianLength = encodedUpgrade.toUint8(index);
  33. index += 1;
  34. gsu.newGuardianSet = ReceiverStructs.GuardianSet({
  35. keys: new address[](guardianLength),
  36. expirationTime: 0
  37. });
  38. for (uint i = 0; i < guardianLength; i++) {
  39. gsu.newGuardianSet.keys[i] = encodedUpgrade.toAddress(index);
  40. index += 20;
  41. }
  42. require(encodedUpgrade.length == index, "invalid GuardianSetUpgrade");
  43. }
  44. }